Merge "veyron/runtimes/google/security: Preparation for moving identity implementation to the public API and to VDL."
diff --git a/examples/boxes/android/src/boxesp2p/main.go b/examples/boxes/android/src/boxesp2p/main.go
index b76d464..59d2293 100644
--- a/examples/boxes/android/src/boxesp2p/main.go
+++ b/examples/boxes/android/src/boxesp2p/main.go
@@ -67,8 +67,8 @@
 	"unsafe"
 
 	"veyron/examples/boxes"
-	vsync "veyron/runtimes/google/vsync"
 	inaming "veyron/runtimes/google/naming"
+	vsync "veyron/runtimes/google/vsync"
 	"veyron/services/store/raw"
 	storage "veyron/services/store/server"
 
@@ -88,9 +88,9 @@
 }
 
 type goState struct {
-	runtime    veyron2.Runtime
-	store      *storage.Server
-	ipc        ipc.Server
+	runtime veyron2.Runtime
+	store   *storage.Server
+	ipc     ipc.Server
 
 	drawStream boxes.DrawInterfaceDrawStream
 	signalling boxes.BoxSignalling
@@ -104,11 +104,11 @@
 )
 
 const (
-	drawServicePort   = ":8509"
-	storeServicePort  = ":8000"
-	syncServicePort   = ":8001"
-	storePath         = "/data/data/com.boxes.android.draganddraw/files/vsync"
-	storeDatabase     = "veyron_store.db"
+	drawServicePort  = ":8509"
+	storeServicePort = ":8000"
+	syncServicePort  = ":8001"
+	storePath        = "/data/data/com.boxes.android.draganddraw/files/vsync"
+	storeDatabase    = "veyron_store.db"
 )
 
 func (jni *jniState) registerAddBox(env *C.JNIEnv, obj C.jobject) {
@@ -129,7 +129,7 @@
 	C.callMethod(env, jni.jObj, jni.jMID, jBoxId, &jPoints[0])
 }
 
-func (gs *goState) Draw(context ipc.Context, stream boxes.DrawInterfaceServiceDrawStream) error {
+func (gs *goState) Draw(context ipc.ServerContext, stream boxes.DrawInterfaceServiceDrawStream) error {
 	// Get the endpoint of the remote process
 	endPt, err := inaming.NewEndpoint(context.RemoteAddr().String())
 	if err != nil {
@@ -173,17 +173,17 @@
 	if err := srv.Register("draw", ipc.SoloDispatcher(drawServer, auth)); err != nil {
 		panic(fmt.Errorf("Failed Register:%v", err))
 	}
-	endPt, err := srv.Listen("tcp", myIPAddr + drawServicePort)
+	endPt, err := srv.Listen("tcp", myIPAddr+drawServicePort)
 	if err != nil {
 		panic(fmt.Errorf("Failed to Listen:%v", err))
 	}
-	if err := gs.signalling.Add(endPt.String()); err != nil {
+	if err := gs.signalling.Add(gs.runtime.TODOContext(), endPt.String()); err != nil {
 		panic(fmt.Errorf("Failed to Add endpoint to signalling server:%v", err))
 	}
 }
 
 func (gs *goState) connectPeer() {
-	endpointStr, err := gs.signalling.Get()
+	endpointStr, err := gs.signalling.Get(gs.runtime.TODOContext())
 	if err != nil {
 		panic(fmt.Errorf("failed to Get peer endpoint from signalling server:%v\n", err))
 	}
@@ -191,7 +191,7 @@
 	if err != nil {
 		panic(fmt.Errorf("failed BindDrawInterface:%v\n", err))
 	}
-	if gs.drawStream, err = drawInterface.Draw(); err != nil {
+	if gs.drawStream, err = drawInterface.Draw(gs.runtime.TODOContext()); err != nil {
 		panic(fmt.Errorf("failed to get handle to Draw stream:%v\n", err))
 	}
 
@@ -265,7 +265,7 @@
 	}
 
 	// Create an endpoint and start listening
-	if _, err = gs.ipc.Listen("tcp", myIPAddr + storeServicePort); err != nil {
+	if _, err = gs.ipc.Listen("tcp", myIPAddr+storeServicePort); err != nil {
 		panic(fmt.Errorf("s.Listen() failed:%v", err))
 	}
 }
@@ -273,11 +273,11 @@
 func initSyncService(peerEndpoint string) {
 	peerSyncAddr := strings.Split(peerEndpoint, ":")[0]
 	storeName := "/" + myIPAddr + storeServicePort
-	srv:= vsync.NewServerSync(vsync.NewSyncd(peerSyncAddr + syncServicePort, peerSyncAddr /* peer deviceID */, myIPAddr /* my deviceID */, storePath, storeName, 1))
+	srv := vsync.NewServerSync(vsync.NewSyncd(peerSyncAddr+syncServicePort, peerSyncAddr /* peer deviceID */, myIPAddr /* my deviceID */, storePath, storeName, 1))
 	if err := gs.ipc.Register("sync", ipc.SoloDispatcher(srv, nil)); err != nil {
 		panic(fmt.Errorf("syncd:: error registering service: err %v", err))
 	}
-	if _, err := gs.ipc.Listen("tcp", myIPAddr + syncServicePort); err != nil {
+	if _, err := gs.ipc.Listen("tcp", myIPAddr+syncServicePort); err != nil {
 		panic(fmt.Errorf("syncd:: error listening to service: err %v", err))
 	}
 }
diff --git a/examples/boxes/boxes.vdl.go b/examples/boxes/boxes.vdl.go
index 00fea43..84d6297 100644
--- a/examples/boxes/boxes.vdl.go
+++ b/examples/boxes/boxes.vdl.go
@@ -30,9 +30,9 @@
 // to enable embedding without method collisions.  Not to be used directly by clients.
 type BoxSignalling_ExcludingUniversal interface {
 	// Add endpoint information to the signalling server.
-	Add(Endpoint string, opts ..._gen_ipc.ClientCallOpt) (err error)
+	Add(ctx _gen_ipc.Context, Endpoint string, opts ..._gen_ipc.CallOpt) (err error)
 	// Get endpoint information about a peer.
-	Get(opts ..._gen_ipc.ClientCallOpt) (reply string, err error)
+	Get(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply string, err error)
 }
 type BoxSignalling interface {
 	_gen_ipc.UniversalServiceMethods
@@ -43,9 +43,9 @@
 type BoxSignallingService interface {
 
 	// Add endpoint information to the signalling server.
-	Add(context _gen_ipc.Context, Endpoint string) (err error)
+	Add(context _gen_ipc.ServerContext, Endpoint string) (err error)
 	// Get endpoint information about a peer.
-	Get(context _gen_ipc.Context) (reply string, err error)
+	Get(context _gen_ipc.ServerContext) (reply string, err error)
 }
 
 // BindBoxSignalling returns the client stub implementing the BoxSignalling
@@ -91,9 +91,9 @@
 	name   string
 }
 
-func (__gen_c *clientStubBoxSignalling) Add(Endpoint string, opts ..._gen_ipc.ClientCallOpt) (err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "Add", []interface{}{Endpoint}, opts...); err != nil {
+func (__gen_c *clientStubBoxSignalling) Add(ctx _gen_ipc.Context, Endpoint string, opts ..._gen_ipc.CallOpt) (err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "Add", []interface{}{Endpoint}, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&err); ierr != nil {
@@ -102,9 +102,9 @@
 	return
 }
 
-func (__gen_c *clientStubBoxSignalling) Get(opts ..._gen_ipc.ClientCallOpt) (reply string, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "Get", nil, opts...); err != nil {
+func (__gen_c *clientStubBoxSignalling) Get(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply string, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "Get", nil, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -113,9 +113,9 @@
 	return
 }
 
-func (__gen_c *clientStubBoxSignalling) UnresolveStep(opts ..._gen_ipc.ClientCallOpt) (reply []string, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "UnresolveStep", nil, opts...); err != nil {
+func (__gen_c *clientStubBoxSignalling) UnresolveStep(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply []string, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "UnresolveStep", nil, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -124,9 +124,9 @@
 	return
 }
 
-func (__gen_c *clientStubBoxSignalling) Signature(opts ..._gen_ipc.ClientCallOpt) (reply _gen_ipc.ServiceSignature, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "Signature", nil, opts...); err != nil {
+func (__gen_c *clientStubBoxSignalling) Signature(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply _gen_ipc.ServiceSignature, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "Signature", nil, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -135,9 +135,9 @@
 	return
 }
 
-func (__gen_c *clientStubBoxSignalling) GetMethodTags(method string, opts ..._gen_ipc.ClientCallOpt) (reply []interface{}, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "GetMethodTags", []interface{}{method}, opts...); err != nil {
+func (__gen_c *clientStubBoxSignalling) GetMethodTags(ctx _gen_ipc.Context, method string, opts ..._gen_ipc.CallOpt) (reply []interface{}, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "GetMethodTags", []interface{}{method}, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -225,7 +225,7 @@
 // to enable embedding without method collisions.  Not to be used directly by clients.
 type DrawInterface_ExcludingUniversal interface {
 	// Send/Receive a stream of boxes with another peer
-	Draw(opts ..._gen_ipc.ClientCallOpt) (reply DrawInterfaceDrawStream, err error)
+	Draw(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply DrawInterfaceDrawStream, err error)
 }
 type DrawInterface interface {
 	_gen_ipc.UniversalServiceMethods
@@ -236,7 +236,7 @@
 type DrawInterfaceService interface {
 
 	// Send/Receive a stream of boxes with another peer
-	Draw(context _gen_ipc.Context, stream DrawInterfaceServiceDrawStream) (err error)
+	Draw(context _gen_ipc.ServerContext, stream DrawInterfaceServiceDrawStream) (err error)
 }
 
 // DrawInterfaceDrawStream is the interface for streaming responses of the method
@@ -267,7 +267,7 @@
 
 // Implementation of the DrawInterfaceDrawStream interface that is not exported.
 type implDrawInterfaceDrawStream struct {
-	clientCall _gen_ipc.ClientCall
+	clientCall _gen_ipc.Call
 }
 
 func (c *implDrawInterfaceDrawStream) Send(item Box) error {
@@ -363,18 +363,18 @@
 	name   string
 }
 
-func (__gen_c *clientStubDrawInterface) Draw(opts ..._gen_ipc.ClientCallOpt) (reply DrawInterfaceDrawStream, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "Draw", nil, opts...); err != nil {
+func (__gen_c *clientStubDrawInterface) Draw(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply DrawInterfaceDrawStream, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "Draw", nil, opts...); err != nil {
 		return
 	}
 	reply = &implDrawInterfaceDrawStream{clientCall: call}
 	return
 }
 
-func (__gen_c *clientStubDrawInterface) UnresolveStep(opts ..._gen_ipc.ClientCallOpt) (reply []string, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "UnresolveStep", nil, opts...); err != nil {
+func (__gen_c *clientStubDrawInterface) UnresolveStep(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply []string, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "UnresolveStep", nil, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -383,9 +383,9 @@
 	return
 }
 
-func (__gen_c *clientStubDrawInterface) Signature(opts ..._gen_ipc.ClientCallOpt) (reply _gen_ipc.ServiceSignature, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "Signature", nil, opts...); err != nil {
+func (__gen_c *clientStubDrawInterface) Signature(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply _gen_ipc.ServiceSignature, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "Signature", nil, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -394,9 +394,9 @@
 	return
 }
 
-func (__gen_c *clientStubDrawInterface) GetMethodTags(method string, opts ..._gen_ipc.ClientCallOpt) (reply []interface{}, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "GetMethodTags", []interface{}{method}, opts...); err != nil {
+func (__gen_c *clientStubDrawInterface) GetMethodTags(ctx _gen_ipc.Context, method string, opts ..._gen_ipc.CallOpt) (reply []interface{}, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "GetMethodTags", []interface{}{method}, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
diff --git a/examples/boxes/signallingserver/main.go b/examples/boxes/signallingserver/main.go
index 08bbd0f..dc413e8 100644
--- a/examples/boxes/signallingserver/main.go
+++ b/examples/boxes/signallingserver/main.go
@@ -19,13 +19,13 @@
 
 type boxAppEndpoint string
 
-func (b *boxAppEndpoint) Add(_ ipc.Context, Endpoint string) (err error) {
+func (b *boxAppEndpoint) Add(_ ipc.ServerContext, Endpoint string) (err error) {
 	*b = boxAppEndpoint(Endpoint)
 	log.Printf("Added endpoint %v to signalling service", *b)
 	return nil
 }
 
-func (b *boxAppEndpoint) Get(_ ipc.Context) (Endpoint string, err error) {
+func (b *boxAppEndpoint) Get(_ ipc.ServerContext) (Endpoint string, err error) {
 	log.Printf("Returning endpoints:%v from signalling service", *b)
 	return string(*b), nil
 }
diff --git a/examples/fortune/fortune.vdl.go b/examples/fortune/fortune.vdl.go
index e1382b8..09f5323 100644
--- a/examples/fortune/fortune.vdl.go
+++ b/examples/fortune/fortune.vdl.go
@@ -21,9 +21,9 @@
 // to enable embedding without method collisions.  Not to be used directly by clients.
 type Fortune_ExcludingUniversal interface {
 	// Get returns a random fortune.
-	Get(opts ..._gen_ipc.ClientCallOpt) (reply string, err error)
+	Get(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply string, err error)
 	// Add stores a fortune in the set used by Get.
-	Add(Fortune string, opts ..._gen_ipc.ClientCallOpt) (err error)
+	Add(ctx _gen_ipc.Context, Fortune string, opts ..._gen_ipc.CallOpt) (err error)
 }
 type Fortune interface {
 	_gen_ipc.UniversalServiceMethods
@@ -34,9 +34,9 @@
 type FortuneService interface {
 
 	// Get returns a random fortune.
-	Get(context _gen_ipc.Context) (reply string, err error)
+	Get(context _gen_ipc.ServerContext) (reply string, err error)
 	// Add stores a fortune in the set used by Get.
-	Add(context _gen_ipc.Context, Fortune string) (err error)
+	Add(context _gen_ipc.ServerContext, Fortune string) (err error)
 }
 
 // BindFortune returns the client stub implementing the Fortune
@@ -82,9 +82,9 @@
 	name   string
 }
 
-func (__gen_c *clientStubFortune) Get(opts ..._gen_ipc.ClientCallOpt) (reply string, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "Get", nil, opts...); err != nil {
+func (__gen_c *clientStubFortune) Get(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply string, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "Get", nil, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -93,9 +93,9 @@
 	return
 }
 
-func (__gen_c *clientStubFortune) Add(Fortune string, opts ..._gen_ipc.ClientCallOpt) (err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "Add", []interface{}{Fortune}, opts...); err != nil {
+func (__gen_c *clientStubFortune) Add(ctx _gen_ipc.Context, Fortune string, opts ..._gen_ipc.CallOpt) (err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "Add", []interface{}{Fortune}, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&err); ierr != nil {
@@ -104,9 +104,9 @@
 	return
 }
 
-func (__gen_c *clientStubFortune) UnresolveStep(opts ..._gen_ipc.ClientCallOpt) (reply []string, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "UnresolveStep", nil, opts...); err != nil {
+func (__gen_c *clientStubFortune) UnresolveStep(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply []string, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "UnresolveStep", nil, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -115,9 +115,9 @@
 	return
 }
 
-func (__gen_c *clientStubFortune) Signature(opts ..._gen_ipc.ClientCallOpt) (reply _gen_ipc.ServiceSignature, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "Signature", nil, opts...); err != nil {
+func (__gen_c *clientStubFortune) Signature(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply _gen_ipc.ServiceSignature, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "Signature", nil, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -126,9 +126,9 @@
 	return
 }
 
-func (__gen_c *clientStubFortune) GetMethodTags(method string, opts ..._gen_ipc.ClientCallOpt) (reply []interface{}, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "GetMethodTags", []interface{}{method}, opts...); err != nil {
+func (__gen_c *clientStubFortune) GetMethodTags(ctx _gen_ipc.Context, method string, opts ..._gen_ipc.CallOpt) (reply []interface{}, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "GetMethodTags", []interface{}{method}, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
diff --git a/examples/fortune/fortune/main.go b/examples/fortune/fortune/main.go
index 2a92eb6..96bc2bb 100644
--- a/examples/fortune/fortune/main.go
+++ b/examples/fortune/fortune/main.go
@@ -37,7 +37,7 @@
 	// Issue a Get() rpc specifying the provided pattern for the server's identity as
 	// an option. If no pattern is provided then the default pattern "*" matches all
 	// identities.
-	fortune, err := s.Get(veyron2.RemoteID(*serverPattern))
+	fortune, err := s.Get(runtime.NewContext(), veyron2.RemoteID(*serverPattern))
 	if err != nil {
 		log.Fatal("error getting fortune: ", err)
 	}
@@ -46,7 +46,7 @@
 	// If the user specified --new_fortune, Add() it to the server’s set of fortunes.
 	// Again, the provided pattern on the server's identity is passed as an option.
 	if *newFortune != "" {
-		if err := s.Add(*newFortune, veyron2.RemoteID(*serverPattern)); err != nil {
+		if err := s.Add(runtime.NewContext(), *newFortune, veyron2.RemoteID(*serverPattern)); err != nil {
 			log.Fatal("error adding fortune: ", err)
 		}
 	}
diff --git a/examples/fortune/fortuned/main.go b/examples/fortune/fortuned/main.go
index a49f55a..3e812ac 100644
--- a/examples/fortune/fortuned/main.go
+++ b/examples/fortune/fortuned/main.go
@@ -34,11 +34,11 @@
 	}
 }
 
-func (f *fortuned) Get(_ ipc.Context) (Fortune string, err error) {
+func (f *fortuned) Get(_ ipc.ServerContext) (Fortune string, err error) {
 	return f.fortunes[f.random.Intn(len(f.fortunes))], nil
 }
 
-func (f *fortuned) Add(_ ipc.Context, Fortune string) error {
+func (f *fortuned) Add(_ ipc.ServerContext, Fortune string) error {
 	f.fortunes = append(f.fortunes, Fortune)
 	return nil
 }
diff --git a/examples/inspector/inspector.vdl.go b/examples/inspector/inspector.vdl.go
index 67e0b36..ede2f60 100644
--- a/examples/inspector/inspector.vdl.go
+++ b/examples/inspector/inspector.vdl.go
@@ -29,8 +29,8 @@
 // Inspector_ExcludingUniversal is the interface without internal framework-added methods
 // to enable embedding without method collisions.  Not to be used directly by clients.
 type Inspector_ExcludingUniversal interface {
-	Ls(Glob string, opts ..._gen_ipc.ClientCallOpt) (reply InspectorLsStream, err error)
-	LsDetails(Glob string, opts ..._gen_ipc.ClientCallOpt) (reply InspectorLsDetailsStream, err error)
+	Ls(ctx _gen_ipc.Context, Glob string, opts ..._gen_ipc.CallOpt) (reply InspectorLsStream, err error)
+	LsDetails(ctx _gen_ipc.Context, Glob string, opts ..._gen_ipc.CallOpt) (reply InspectorLsDetailsStream, err error)
 }
 type Inspector interface {
 	_gen_ipc.UniversalServiceMethods
@@ -39,8 +39,8 @@
 
 // InspectorService is the interface the server implements.
 type InspectorService interface {
-	Ls(context _gen_ipc.Context, Glob string, stream InspectorServiceLsStream) (err error)
-	LsDetails(context _gen_ipc.Context, Glob string, stream InspectorServiceLsDetailsStream) (err error)
+	Ls(context _gen_ipc.ServerContext, Glob string, stream InspectorServiceLsStream) (err error)
+	LsDetails(context _gen_ipc.ServerContext, Glob string, stream InspectorServiceLsDetailsStream) (err error)
 }
 
 // InspectorLsStream is the interface for streaming responses of the method
@@ -61,7 +61,7 @@
 
 // Implementation of the InspectorLsStream interface that is not exported.
 type implInspectorLsStream struct {
-	clientCall _gen_ipc.ClientCall
+	clientCall _gen_ipc.Call
 }
 
 func (c *implInspectorLsStream) Recv() (item string, err error) {
@@ -115,7 +115,7 @@
 
 // Implementation of the InspectorLsDetailsStream interface that is not exported.
 type implInspectorLsDetailsStream struct {
-	clientCall _gen_ipc.ClientCall
+	clientCall _gen_ipc.Call
 }
 
 func (c *implInspectorLsDetailsStream) Recv() (item Details, err error) {
@@ -194,27 +194,27 @@
 	name   string
 }
 
-func (__gen_c *clientStubInspector) Ls(Glob string, opts ..._gen_ipc.ClientCallOpt) (reply InspectorLsStream, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "Ls", []interface{}{Glob}, opts...); err != nil {
+func (__gen_c *clientStubInspector) Ls(ctx _gen_ipc.Context, Glob string, opts ..._gen_ipc.CallOpt) (reply InspectorLsStream, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "Ls", []interface{}{Glob}, opts...); err != nil {
 		return
 	}
 	reply = &implInspectorLsStream{clientCall: call}
 	return
 }
 
-func (__gen_c *clientStubInspector) LsDetails(Glob string, opts ..._gen_ipc.ClientCallOpt) (reply InspectorLsDetailsStream, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "LsDetails", []interface{}{Glob}, opts...); err != nil {
+func (__gen_c *clientStubInspector) LsDetails(ctx _gen_ipc.Context, Glob string, opts ..._gen_ipc.CallOpt) (reply InspectorLsDetailsStream, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "LsDetails", []interface{}{Glob}, opts...); err != nil {
 		return
 	}
 	reply = &implInspectorLsDetailsStream{clientCall: call}
 	return
 }
 
-func (__gen_c *clientStubInspector) UnresolveStep(opts ..._gen_ipc.ClientCallOpt) (reply []string, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "UnresolveStep", nil, opts...); err != nil {
+func (__gen_c *clientStubInspector) UnresolveStep(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply []string, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "UnresolveStep", nil, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -223,9 +223,9 @@
 	return
 }
 
-func (__gen_c *clientStubInspector) Signature(opts ..._gen_ipc.ClientCallOpt) (reply _gen_ipc.ServiceSignature, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "Signature", nil, opts...); err != nil {
+func (__gen_c *clientStubInspector) Signature(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply _gen_ipc.ServiceSignature, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "Signature", nil, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -234,9 +234,9 @@
 	return
 }
 
-func (__gen_c *clientStubInspector) GetMethodTags(method string, opts ..._gen_ipc.ClientCallOpt) (reply []interface{}, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "GetMethodTags", []interface{}{method}, opts...); err != nil {
+func (__gen_c *clientStubInspector) GetMethodTags(ctx _gen_ipc.Context, method string, opts ..._gen_ipc.CallOpt) (reply []interface{}, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "GetMethodTags", []interface{}{method}, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
diff --git a/examples/inspector/inspector/main.go b/examples/inspector/inspector/main.go
index 1683b16..470044a 100644
--- a/examples/inspector/inspector/main.go
+++ b/examples/inspector/inspector/main.go
@@ -63,7 +63,7 @@
 }
 
 // ls and lsdashl are idiomatic for use without stubs
-func ls(call ipc.ClientCall) {
+func ls(call ipc.Call) {
 	for {
 		var n string
 		if err := call.Recv(&n); err != nil {
@@ -77,7 +77,7 @@
 	}
 }
 
-func lsdashl(call ipc.ClientCall) {
+func lsdashl(call ipc.Call) {
 	type details struct {
 		Name    string
 		Size    int64
@@ -104,7 +104,7 @@
 		vlog.Fatalf("failed to create new client: %q", err)
 	}
 	defer client.Close()
-	call, err := client.StartCall(service, "List", []interface{}{glob, details})
+	call, err := client.StartCall(rt.R().NewContext(), service, "List", []interface{}{glob, details})
 	if err != nil {
 		vlog.Fatalf("failed to start call: %q", err)
 	}
@@ -166,14 +166,15 @@
 	bail := func(err error) {
 		vlog.Fatalf("failed to start call: %q", err)
 	}
+	ctx := rt.R().NewContext()
 	if details {
-		if stream, err := inspector.LsDetails(glob); err != nil {
+		if stream, err := inspector.LsDetails(ctx, glob); err != nil {
 			bail(err)
 		} else {
 			streamDetails(stream)
 		}
 	} else {
-		if stream, err := inspector.Ls(glob); err != nil {
+		if stream, err := inspector.Ls(ctx, glob); err != nil {
 			bail(err)
 		} else {
 			streamNames(stream)
diff --git a/examples/inspector/inspectord/services.go b/examples/inspector/inspectord/services.go
index b39a073..1a087a6 100644
--- a/examples/inspector/inspectord/services.go
+++ b/examples/inspector/inspectord/services.go
@@ -71,7 +71,7 @@
 }
 
 type stubbedServer struct {
-	context ipc.Context
+	context ipc.ServerContext
 	names   inspector.InspectorServiceLsStream
 	details inspector.InspectorServiceLsDetailsStream
 }
@@ -145,13 +145,13 @@
 }
 
 // Ls is a stubbed server method
-func (s *server) Ls(context ipc.Context, Glob string, Stream inspector.InspectorServiceLsStream) error {
+func (s *server) Ls(context ipc.ServerContext, Glob string, Stream inspector.InspectorServiceLsStream) error {
 	log.Infof("Ls %q", Glob)
 	return s.ls(Glob, false, &stubbedServer{context: context, names: Stream})
 }
 
 // LsDetails is a stubbed server method
-func (s *server) LsDetails(context ipc.Context, Glob string, Stream inspector.InspectorServiceLsDetailsStream) error {
+func (s *server) LsDetails(context ipc.ServerContext, Glob string, Stream inspector.InspectorServiceLsDetailsStream) error {
 	log.Infof("LsDetails %q", Glob)
 	return s.ls(Glob, true, &stubbedServer{context: context, details: Stream})
 }
diff --git a/examples/pipetobrowser/.gitignore b/examples/pipetobrowser/.gitignore
new file mode 100644
index 0000000..4b85d71
--- /dev/null
+++ b/examples/pipetobrowser/.gitignore
@@ -0,0 +1,2 @@
+browser/libs/vendor/veyron
+.DS_Store
\ No newline at end of file
diff --git a/examples/pipetobrowser/Makefile b/examples/pipetobrowser/Makefile
new file mode 100644
index 0000000..c8411e6
--- /dev/null
+++ b/examples/pipetobrowser/Makefile
@@ -0,0 +1,53 @@
+#
+# TODO(aghassemi) These commands are just for convenience.
+# Remove this file and references to it from README before release.
+#
+
+PATH:=$(PATH):$(VEYRON_ROOT)/environment/cout/node/bin
+VEYRON_MOUNTTABLE=$(VEYRON_ROOT)/veyron/go/bin/mounttabled
+VEYRON_WSPR=$(VEYRON_ROOT)/veyron/go/bin/wsprd
+VEYRON_PROXY=$(VEYRON_ROOT)/veyron/go/bin/proxyd
+VEYRON_IDENT=$(VEYRON_ROOT)/veyron/go/bin/identity
+VEYRON_IDENTITYD=$(VEYRON_ROOT)/veyron/go/bin/identityd
+VEYRON_MOUNTTABLE=$(VEYRON_ROOT)/veyron/go/bin/mounttabled
+VEYRON_PROXY_PORT=5164
+VEYRON_MOUNTTABLE_PORT=5167
+VEYRON_PROXY_ADDR=127.0.0.1:$(VEYRON_PROXY_PORT)
+VEYRON_WSPR_PORT=5165
+VEYRON_IDENTITY_PORT=5163
+VEYRON_JS_API=$(VEYRON_ROOT)/veyron/javascript/api
+VEYRON_IDENTITY_PATH=/tmp/p2b_identity
+
+# Builds everything
+default: build
+build: buildbrowser
+
+# Builds browser version of FortuneJS
+buildbrowser:
+	(cd $(VEYRON_JS_API) && ./vgrunt build) && \
+	mkdir -p ./browser/libs/vendor/veyron && \
+	cp -rf $(VEYRON_JS_API)/dist/*.* ./browser/libs/vendor/veyron
+
+# Deploys Veyron daemons
+daemons:
+	@if [[ ! -e $(VEYRON_PROXY) ]]; then \
+		echo "Veyron proxy could not be found in $(VEYRON_PROXY). Please build and install veyron2 and services first"; \
+		exit 1; \
+	fi
+
+	$(VEYRON_IDENT) --name=veyron_p2b_identity > $(VEYRON_IDENTITY_PATH)
+
+	export VEYRON_IDENTITY=$(VEYRON_IDENTITY_PATH) ; \
+	$(VEYRON_IDENTITYD) --port=$(VEYRON_IDENTITY_PORT) & \
+	$(VEYRON_MOUNTTABLE) --address=:$(VEYRON_MOUNTTABLE_PORT) & \
+	export MOUNTTABLE_ROOT=/localhost:$(VEYRON_MOUNTTABLE_PORT)/mt ; \
+	$(VEYRON_PROXY) -address=$(VEYRON_PROXY_ADDR) & \
+	$(VEYRON_WSPR) --v=1 -logtostderr=true -vproxy=$(VEYRON_PROXY_ADDR) --port $(VEYRON_WSPR_PORT) & \
+	$(VEYRON_STORE) --address=:$(VEYRON_STORE_PORT) --name=global/$(USER)/store &
+
+killdaemons:
+	kill `lsof -t -i:$(VEYRON_MOUNTTABLE_PORT)`; \
+	kill `lsof -t -i:$(VEYRON_IDENTITY_PORT)`; \
+	kill `lsof -t -i:$(VEYRON_WSPR_PORT)`; \
+	kill `lsof -t -i:$(VEYRON_PROXY_PORT)`; \
+	kill `lsof -t -i:$(VEYRON_STORE_PORT)`
diff --git a/examples/pipetobrowser/browser/actions/README b/examples/pipetobrowser/browser/actions/README
new file mode 100644
index 0000000..daf6a18
--- /dev/null
+++ b/examples/pipetobrowser/browser/actions/README
@@ -0,0 +1,6 @@
+Actions are cohesive pieces of functionality that can be triggered from any other action in a decoupled way by just using the action name.
+
+Please see documentation in libs/mvc/actions.js for more details about the action concept.
+
+This folder contains modules that define functions to register and trigger application-specific actions.
+These modules glue views and application services and state.
diff --git a/examples/pipetobrowser/browser/actions/display-pipe-viewer.js b/examples/pipetobrowser/browser/actions/display-pipe-viewer.js
new file mode 100644
index 0000000..75c9b6f
--- /dev/null
+++ b/examples/pipetobrowser/browser/actions/display-pipe-viewer.js
@@ -0,0 +1,51 @@
+import { Logger } from 'libs/logs/logger'
+import { register, trigger } from 'libs/mvc/actions'
+
+import { get as getPipeViewer } from 'pipe-viewers/manager'
+
+import { triggerErrorAction } from 'actions/error'
+
+import { PageView } from 'views/page/view'
+import { PipeViewerPlaceholderView } from 'views/pipe-viewer-placeholder/view'
+
+var log = new Logger('actions/display-pipe-viewer');
+const ACTION_NAME = 'displayPipeViewer';
+
+/*
+ * Registers the display pipe viewer action
+ */
+export function registerDisplayPipeViewerAction() {
+  register(ACTION_NAME, actionHandler);
+}
+
+/*
+ * Triggers the display pipe viewer action
+ */
+export function triggerDisplayPipeViewerAction(name, stream) {
+  return trigger(ACTION_NAME, name, stream);
+}
+
+/*
+ * Handles the displayPipeViewer action.
+ * @param {string} name Name of the Pipe Viewer that is requested to play the stream.
+ * @param {Veyron.Stream} stream Stream of bytes from the p2b client.
+ *
+ * @private
+ */
+function actionHandler(name, stream) {
+  log.debug('displayPipeViewer action triggered');
+
+  var viewerPlaceholderView = new PipeViewerPlaceholderView();
+
+  // Get the plugin that can render the stream, ask it to play it and display
+  // the element returned by the pipeViewer.
+  getPipeViewer(name).then((pipeViewer) => {
+    return pipeViewer.play(stream);
+  }).then((viewerView) => {
+    viewerPlaceholderView.showViewer(viewerView);
+  }).catch((e) => { triggerErrorAction(e); });
+
+  // create a page and display the viewer placeholder view in main content area
+  var pageView = new PageView();
+  pageView.setMainView(viewerPlaceholderView);
+}
diff --git a/examples/pipetobrowser/browser/actions/error.js b/examples/pipetobrowser/browser/actions/error.js
new file mode 100644
index 0000000..796aa5c
--- /dev/null
+++ b/examples/pipetobrowser/browser/actions/error.js
@@ -0,0 +1,39 @@
+import { Logger } from 'libs/logs/logger'
+import { register, trigger } from 'libs/mvc/actions'
+
+import { PageView } from 'views/page/view'
+import { ErrorView } from 'views/error/view'
+
+var log = new Logger('actions/error');
+const ACTION_NAME = 'error';
+
+/*
+ * Registers the error action
+ */
+export function registerErrorAction() {
+  register(ACTION_NAME, actionHandler);
+}
+
+/*
+ * Triggers the error action
+ */
+export function triggerErrorAction(err) {
+  return trigger(ACTION_NAME, err);
+}
+
+/*
+ * Handles the error action.
+ *
+ * @private
+ */
+function actionHandler(err) {
+  log.debug('error action triggered');
+
+  // Create an error view
+  var errorView = new ErrorView(err);
+
+  // create a page and display the error view in main content area
+  var pageView = new PageView();
+  pageView.setMainView(errorView);
+}
+
diff --git a/examples/pipetobrowser/browser/actions/home.js b/examples/pipetobrowser/browser/actions/home.js
new file mode 100644
index 0000000..1ae036d
--- /dev/null
+++ b/examples/pipetobrowser/browser/actions/home.js
@@ -0,0 +1,60 @@
+import { Logger } from 'libs/logs/logger'
+import { register, trigger } from 'libs/mvc/actions'
+
+import { publish, state as publishState } from 'services/pipe-to-browser'
+
+import { triggerErrorAction } from 'actions/error'
+import { triggerDisplayPipeViewerAction } from 'actions/display-pipe-viewer'
+
+import { PageView } from 'views/page/view'
+import { PublishView } from 'views/publish/view'
+
+var log = new Logger('actions/home');
+const ACTION_NAME = 'home';
+
+/*
+ * Registers the home action
+ */
+export function registerHomeAction() {
+  register(ACTION_NAME, actionHandler);
+}
+
+/*
+ * Triggers the home action
+ */
+export function triggerHomeAction() {
+  return trigger(ACTION_NAME);
+}
+
+/*
+ * Handles the home action.
+ *
+ * @private
+ */
+function actionHandler() {
+  log.debug('home action triggered');
+
+  // Create a publish view and bind (dynamic) publish state (publishing, published, name) with the view
+  var publishView = new PublishView(publishState);
+
+  // Publish p2b when user tells us to do so.
+  publishView.onPublishAction((publishName) => {
+    publish(publishName, pipeRequestHandler).catch((e) => {  triggerErrorAction(e); } );
+  });
+
+  // create a page and display the publish view in main content area
+  var pageView = new PageView();
+  pageView.setMainView(publishView);
+}
+
+/*
+ * pipeRequestHandler is called the p2b service whenever a new request comes in.
+ * We simply delegate to the displayPipeViewer action.
+ * @param {string} name Name of the Pipe Viewer that is requested to play the stream.
+ * @param {Veyron.Stream} stream Stream of bytes from the p2b client.
+ *
+ * @private
+ */
+function pipeRequestHandler(name, stream) {
+  return triggerDisplayPipeViewerAction(name, stream);
+}
\ No newline at end of file
diff --git a/examples/pipetobrowser/browser/app.js b/examples/pipetobrowser/browser/app.js
new file mode 100644
index 0000000..c091581
--- /dev/null
+++ b/examples/pipetobrowser/browser/app.js
@@ -0,0 +1,32 @@
+import { Logger } from 'libs/logs/logger'
+
+import { registerHomeAction,  triggerHomeAction } from 'actions/home'
+import { registerErrorAction } from 'actions/error'
+import { registerDisplayPipeViewerAction } from 'actions/display-pipe-viewer'
+
+var log = new Logger('app');
+
+export function start() {
+  log.debug('start called');
+
+  // Register the action handlers for the application
+  registerActions();
+
+  // Start by triggering the home action
+  triggerHomeAction();
+}
+
+/*
+ * Registers the action handlers for the application.
+ * Actions are cohesive pieces of functionality that can be triggered from
+ * any other action in a decoupled way by just using the action name.
+ *
+ * @private
+ */
+function registerActions() {
+  log.debug('registering actions');
+
+  registerHomeAction();
+  registerErrorAction();
+  registerDisplayPipeViewerAction();
+}
\ No newline at end of file
diff --git a/examples/pipetobrowser/browser/config.js b/examples/pipetobrowser/browser/config.js
new file mode 100644
index 0000000..0240c14
--- /dev/null
+++ b/examples/pipetobrowser/browser/config.js
@@ -0,0 +1,15 @@
+/*
+ * App configuration
+ * @fileoverview
+ */
+
+var veyronLogLevels = Veyron.logLevels;
+
+export var config = {
+  veyron: {
+    identityServer: 'http://localhost:5163/random/',
+    proxy: 'http://localhost:5165',
+    logLevel: veyronLogLevels.INFO
+  },
+  publishNamePrefix: 'google/p2b'
+}
\ No newline at end of file
diff --git a/examples/pipetobrowser/browser/index.html b/examples/pipetobrowser/browser/index.html
new file mode 100644
index 0000000..318dd4e
--- /dev/null
+++ b/examples/pipetobrowser/browser/index.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  <meta charset="utf-8">
+  <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, maximum-scale=1">
+  <meta name="description" content="Pipe To Browser (p2b) is a utility built with veyron technology that allows piping of stdout and std from console into local or remote browser windows. Different plugins exist to format the incoming data and display them in an appropriate and interactive format.">
+  <title>Pipe To Browser - because life is too short to stare at unformatted stdout text, and is hard enough already not to have a spell-checker for stdin</title>
+
+  <script src="libs/vendor/polymer/platform/platform.js"></script>
+
+  <!-- TODO(aghassemi) For Production - Use Volcanize to combine all components into a single import at build time -->
+  <link rel="import" href="views/page/component.html">
+  <link rel="import" href="views/publish/component.html">
+  <link rel="import" href="views/error/component.html">
+  <link rel="import" href="views/pipe-viewer-placeholder/component.html">
+</head>
+
+<body>
+
+  <p2b-page></p2b-page>
+
+  <!-- TODO(aghassemi) For Production - Use traceur at built time for ES6 instead -->
+  <script src="libs/vendor/traceur/traceur.js"></script>
+  <script>traceur.options.experimental = true;</script>
+  <script src="libs/vendor/es6-module-loader/es6-module-loader.js"></script>
+
+  <script src="libs/vendor/veyron/veyron.js"></script><!-- TODO(aghassemi) ES6 shim for Veyron -->
+
+  <script src="init.js"></script>
+</body>
+</html>
\ No newline at end of file
diff --git a/examples/pipetobrowser/browser/init.js b/examples/pipetobrowser/browser/init.js
new file mode 100644
index 0000000..5cb784d
--- /dev/null
+++ b/examples/pipetobrowser/browser/init.js
@@ -0,0 +1,19 @@
+/*
+ * Bootstrapping traceur compiler, polymer, and the app itself.
+ * @fileoverview
+ */
+
+window.addEventListener('polymer-ready', function(e) {
+  // alias view and pipe-viewer so external plugins can just reference it without full path.
+  System.paths = {
+    '*': '*.js',
+    'pipe-viewer': 'pipe-viewers/pipe-viewer.js',
+    'view': 'libs/mvc/view.js'
+  };
+
+  System.import('app').then(function(app) {
+      app.start();
+  }).catch(function(e) {
+    console.error(e);
+  });
+});
\ No newline at end of file
diff --git a/examples/pipetobrowser/browser/libs/README b/examples/pipetobrowser/browser/libs/README
new file mode 100644
index 0000000..18c6033
--- /dev/null
+++ b/examples/pipetobrowser/browser/libs/README
@@ -0,0 +1,5 @@
+"libs" includes app-independent modules, whether third-party or internal.
+
+Third-party modules should be inside "vendor"
+
+Modules in "libs" must not depend on anything outside of "libs"
\ No newline at end of file
diff --git a/examples/pipetobrowser/browser/libs/logs/logger.js b/examples/pipetobrowser/browser/libs/logs/logger.js
new file mode 100644
index 0000000..2e1b343
--- /dev/null
+++ b/examples/pipetobrowser/browser/libs/logs/logger.js
@@ -0,0 +1,15 @@
+/*
+ * Logger represents a module that can write logging messages to the console.
+ * @param {string} prefix A string that will be prefixed to every log message
+ * @class
+ */
+export class Logger {
+  constructor(prefix) {
+    prefix = prefix || 'Error';
+    this.prefix_ = prefix;
+  }
+
+  debug(...args) {
+    console.log('DEBUG: ' + this.prefix_ + ':', ...args);
+  }
+};
diff --git a/examples/pipetobrowser/browser/libs/mvc/actions.js b/examples/pipetobrowser/browser/libs/mvc/actions.js
new file mode 100644
index 0000000..ea667d2
--- /dev/null
+++ b/examples/pipetobrowser/browser/libs/mvc/actions.js
@@ -0,0 +1,39 @@
+/*
+ * Actions are a similar concept to routes and simply provide an indirection
+ * through string names to register and call functions.
+ *
+ * Using actions to group and call larger, self-contained functionality like
+ * page transitions allows the framework to provide undo/back support by using
+ * the history API or localStorage.
+ *
+ * Action handlers that are registered for an action, normally are controllers
+ * that glue application services and state with views and handle events.
+ * @overview
+ */
+
+var registeredHandlers = {};
+
+/*
+ * Registers an action and makes it available to be called using only a name.
+ * @param {string} name Action's identifier
+ * @param {function} handler Callback handler to register for the action.
+ * handler will be called with the arguments pass from the caller when action
+ * is triggered.
+ */
+export function register(name, handler) {
+  registeredHandlers[name] = handler;
+}
+
+/*
+ * Calls an action's registered handler.
+ * @param {string} name Action's identifier
+ * @param {*} [...] args Arguments to be passed to the registered handler.
+ * @return {*} Any result returned from the registered handler
+ */
+export function trigger(name, ...args) {
+  var handler = registeredHandlers[name];
+  if(!handler) {
+    throw new Error('No handler registered for action: ' + name);
+  }
+  return handler(...args);
+}
\ No newline at end of file
diff --git a/examples/pipetobrowser/browser/libs/mvc/view.js b/examples/pipetobrowser/browser/libs/mvc/view.js
new file mode 100644
index 0000000..c4b8f50
--- /dev/null
+++ b/examples/pipetobrowser/browser/libs/mvc/view.js
@@ -0,0 +1,19 @@
+/*
+ * Base class for all views.
+ * View is a simple wrapper that represents a DOM element and exposes the public
+ * API of that element. Web Components should be used to encapsulate View
+ * functionality under a single DOM element and handle event binding/triggering,
+ * templating, life-cycle management and attribute exposure and therefore those
+ * features are not duplicated here.
+ * @param {DOMelement} el DOM element this view wraps.
+ * @class
+ */
+export class View {
+	constructor(el) {
+		this._el = el;
+	}
+
+	get element() {
+		return this._el;
+	}
+}
\ No newline at end of file
diff --git a/examples/pipetobrowser/browser/libs/utils/array-buffer.js b/examples/pipetobrowser/browser/libs/utils/array-buffer.js
new file mode 100644
index 0000000..17cee74
--- /dev/null
+++ b/examples/pipetobrowser/browser/libs/utils/array-buffer.js
@@ -0,0 +1,9 @@
+/*
+ * Creates a string, given a sequence of bytes. It assumes UTF-8 encoding.
+ * @param {ArrayBuffer} buf array of bytes that represent a UTF-8 string
+ */
+export function arrayBufferToString(buf) {
+  var encoded = String.fromCharCode.apply(null, buf);
+  var decoded = decodeURIComponent(escape(encoded))
+  return decoded;
+}
\ No newline at end of file
diff --git a/examples/pipetobrowser/browser/libs/utils/exists.js b/examples/pipetobrowser/browser/libs/utils/exists.js
new file mode 100644
index 0000000..9ea45b3
--- /dev/null
+++ b/examples/pipetobrowser/browser/libs/utils/exists.js
@@ -0,0 +1,15 @@
+/*
+ * Given a collection of objects, returns true if all of them exist
+ * Returns false as soon as one does not exist.
+ * @param {*} [...] objects Objects to check existence of
+ * @return {bool} Whether all of the given objects exist or not
+ */
+export function exists(...objects) {
+  for (var obj of objects) {
+    if (typeof obj === 'undefined' || obj === null) {
+      return false;
+    }
+  }
+
+  return true;
+}
diff --git a/examples/pipetobrowser/browser/libs/utils/url.js b/examples/pipetobrowser/browser/libs/utils/url.js
new file mode 100644
index 0000000..266c003
--- /dev/null
+++ b/examples/pipetobrowser/browser/libs/utils/url.js
@@ -0,0 +1,10 @@
+var hasProtocol = new RegExp('^(?:[a-z]+:)?//', 'i');
+
+/*
+ * Decides whether a string is an absolute Url by seeing if it starts with a protocol.
+ * @param {string} val string value to check.
+ * @return {bool} whether or not the string value is a Url
+ */
+export function isAbsoulteUrl(val) {
+  return hasProtocol.test(val);
+}
\ No newline at end of file
diff --git a/examples/pipetobrowser/browser/libs/vendor/README b/examples/pipetobrowser/browser/libs/vendor/README
new file mode 100644
index 0000000..57f6ac5
--- /dev/null
+++ b/examples/pipetobrowser/browser/libs/vendor/README
@@ -0,0 +1 @@
+third-party modules
\ No newline at end of file
diff --git a/examples/pipetobrowser/browser/libs/vendor/es6-module-loader/es6-module-loader.js b/examples/pipetobrowser/browser/libs/vendor/es6-module-loader/es6-module-loader.js
new file mode 100644
index 0000000..1052275
--- /dev/null
+++ b/examples/pipetobrowser/browser/libs/vendor/es6-module-loader/es6-module-loader.js
@@ -0,0 +1,10 @@
+/*
+ *  es6-module-loader v0.5.4
+ *  https://github.com/ModuleLoader/es6-module-loader
+ *  Implemented to the 2013-12-02 ES6 module specification draft
+ *  Copyright (c) 2014 Guy Bedford, Luke Hoban, Addy Osmani; Licensed MIT
+ */
+/*
+ *  ES6 Promises shim from when.js, Copyright (c) 2010-2014 Brian Cavalier, John Hann, MIT License
+ */
+!function(){return"undefined"!=typeof Promise&&Promise.all&&Promise.resolve&&Promise.reject}()&&!function(a){"object"==typeof exports?module.exports=a():"function"==typeof define&&define.amd?define(a):"undefined"!=typeof window?window.Promise=a():"undefined"!=typeof global?global.Promise=a():"undefined"!=typeof self&&(self.Promise=a())}(function(){var a;return function b(a,c,d){function e(g,h){if(!c[g]){if(!a[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);throw new Error("Cannot find module '"+g+"'")}var j=c[g]={exports:{}};a[g][0].call(j.exports,function(b){var c=a[g][1][b];return e(c?c:b)},j,j.exports,b,a,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0;g<d.length;g++)e(d[g]);return e}({1:[function(a,b){var c=b.exports=a("../lib/Promise"),d="undefined"!=typeof global&&global||"undefined"!=typeof window&&window||"undefined"!=typeof self&&self;"undefined"!=typeof d&&"undefined"==typeof d.Promise&&(d.Promise=c)},{"../lib/Promise":2}],2:[function(b,c){!function(a){"use strict";a(function(a){var b=a("./makePromise"),c=a("./scheduler"),d=a("./async");return b({scheduler:new c(d),monitor:"undefined"!=typeof console?console:void 0})})}("function"==typeof a&&a.amd?a:function(a){c.exports=a(b)})},{"./async":4,"./makePromise":5,"./scheduler":6}],3:[function(b,c){!function(a){"use strict";a(function(){function a(a){this.head=this.tail=this.length=0,this.buffer=new Array(1<<a)}return a.prototype.push=function(a){return this.length===this.buffer.length&&this._ensureCapacity(2*this.length),this.buffer[this.tail]=a,this.tail=this.tail+1&this.buffer.length-1,++this.length,this.length},a.prototype.shift=function(){var a=this.buffer[this.head];return this.buffer[this.head]=void 0,this.head=this.head+1&this.buffer.length-1,--this.length,a},a.prototype._ensureCapacity=function(a){var b,c=this.head,d=this.buffer,e=new Array(a),f=0;if(0===c)for(b=this.length;b>f;++f)e[f]=d[f];else{for(a=d.length,b=this.tail;a>c;++f,++c)e[f]=d[c];for(c=0;b>c;++f,++c)e[f]=d[c]}this.buffer=e,this.head=0,this.tail=this.length},a})}("function"==typeof a&&a.amd?a:function(a){c.exports=a()})},{}],4:[function(b,c){!function(a){"use strict";a(function(a){var b,c;return b="undefined"!=typeof process&&null!==process&&"function"==typeof process.nextTick?function(a){process.nextTick(a)}:(c="function"==typeof MutationObserver&&MutationObserver||"function"==typeof WebKitMutationObserver&&WebKitMutationObserver)?function(a,b){function c(){var a=d;d=void 0,a()}var d,e=a.createElement("div"),f=new b(c);return f.observe(e,{attributes:!0}),function(a){d=a,e.setAttribute("class","x")}}(document,c):function(a){try{return a("vertx").runOnLoop||a("vertx").runOnContext}catch(b){}var c=setTimeout;return function(a){c(a,0)}}(a)})}("function"==typeof a&&a.amd?a:function(a){c.exports=a(b)})},{}],5:[function(b,c){!function(a){"use strict";a(function(){return function(a){function b(a){function b(a){f._handler.resolve(a)}function d(a){f._handler.reject(a)}function e(a){f._handler.notify(a)}var f=this;this._handler=new q,c(a,b,d,e)}function c(a,b,c,d){try{a(b,c,d)}catch(e){c(e)}}function d(a){return a instanceof b?a:new j(new r(k(a)))}function e(a){return new j(new r(new v(a)))}function f(){return G}function g(){return new j(new q)}function h(a){function b(a,b,c,d){c.when(F,F,void 0,a,function(a){b[d]=a,0===--g&&this.resolve(b)},a.reject,a.notify)}var c,d,e=new q,f=a.length>>>0,g=f,h=[];for(c=0;f>c;++c)c in a?(d=a[c],C(d)?b(e,h,l(d),c):(h[c]=d,--g)):--g;return 0===g&&e.resolve(h),new j(e)}function i(a){if(Object(a)===a&&0===a.length)return f();for(var b=new q,c=0;c<a.length;++c)k(a[c]).when(F,F,void 0,b,b.resolve,b.reject);return new j(b)}function j(a){this._handler=a}function k(a,c){return a instanceof b?m(a,c):C(a)?n(a):new u(a)}function l(a){return a instanceof b?a._handler.join():n(a)}function m(a,b){var c=a._handler.join();return b===c?w():c}function n(a){try{var b=a.then;return"function"==typeof b?new t(b,a):new u(a)}catch(c){return new v(c)}}function o(){}function p(a){if(this.handler=a,this._isMonitored()){var b=this._env.promiseMonitor.captureStack();this.trace=a._addTrace(b)}}function q(a){this.consumers=[],this.receiver=a,this.handler=void 0,this.resolved=!1,this._isMonitored()&&(this.trace=this._env.promiseMonitor.captureStack())}function r(a){p.call(this,a)}function s(a,b){p.call(this,a),this.receiver=b}function t(a,b){q.call(this),this.assimilated=!1,this.untrustedThen=a,this.thenable=b}function u(a){this.value=a}function v(a){this.value=a,this.observed=!1,this._isMonitored()&&(this.key=this._env.promiseMonitor.startTrace(a))}function w(){return new v(new TypeError("Promise cycle"))}function x(a){return{state:"fulfilled",value:a}}function y(a){return{state:"rejected",reason:a}}function z(){return{state:"pending"}}function A(a,b,c,d,e,f,g,h){this.a=a,this.b=b,this.c=c,this.d=d,this.e=e,this.f=f,this.g=g,this.handler=h}function B(a,b){this.q=a,this.value=b}function C(a){return("object"==typeof a||"function"==typeof a)&&null!==a}function D(a,b,c){try{return a.call(c,b)}catch(d){return e(d)}}function E(a,b,c){try{return a.call(c,b)}catch(d){return d}}function F(){}var G,H=a.scheduler,I=Object.create||function(a){function b(){}return b.prototype=a,new b};return b.resolve=d,b.reject=e,b.never=f,b._defer=g,b.prototype.then=function(a,b,c){var d=this._handler,e=new q(d.receiver);return d.when(e.resolve,e.notify,e,d.receiver,a,b,c),new j(e)},b.prototype["catch"]=b.prototype.otherwise=function(a){return this.then(void 0,a)},b.prototype._bindContext=function(a){return new j(new s(this._handler,a))},b.all=h,b.race=i,j.prototype=I(b.prototype),o.prototype.inspect=z,o.prototype.when=F,o.prototype.resolve=F,o.prototype.reject=F,o.prototype.notify=F,o.prototype.join=function(){return this},o.prototype._env=a.monitor||b,o.prototype._addTrace=F,o.prototype._isMonitored=function(){return"undefined"!=typeof this._env.promiseMonitor},p.prototype=I(o.prototype),p.prototype.join=function(){return this.handler.join()},p.prototype.inspect=function(){return this.handler.inspect()},p.prototype._addTrace=function(a){return this.handler._addTrace(a)},q.prototype=I(o.prototype),q.prototype.inspect=function(){return this.resolved?this.handler.join().inspect():z()},q.prototype.resolve=function(a){this._join(k(a,this))},q.prototype.reject=function(a){this._join(new v(a))},q.prototype.join=function(){return this.resolved?this.handler.join():this},q.prototype.run=function(){var a=this.consumers,b=this.handler=this.handler.join();this.consumers=void 0;for(var c=0;c<a.length;c+=7)b.when(a[c],a[c+1],a[c+2],a[c+3],a[c+4],a[c+5],a[c+6])},q.prototype._join=function(a){this.resolved||(this.resolved=!0,this.handler=a,H.enqueue(this),this._isMonitored()&&(this.trace=a._addTrace(this.trace)))},q.prototype.when=function(a,b,c,d,e,f,g){this.resolved?H.enqueue(new A(a,b,c,d,e,f,g,this.handler.join())):this.consumers.push(a,b,c,d,e,f,g)},q.prototype.notify=function(a){this.resolved||H.enqueue(new B(this.consumers,a))},q.prototype._addTrace=function(a){return this.resolved?this.handler._addTrace(a):a},r.prototype=I(p.prototype),r.prototype.when=function(a,b,c,d,e,f,g){H.enqueue(new A(a,b,c,d,e,f,g,this.join()))},s.prototype=I(p.prototype),s.prototype.when=function(a,b,c,d,e,f,g){void 0!==this.receiver&&(d=this.receiver),this.join().when(a,b,c,d,e,f,g)},t.prototype=I(q.prototype),t.prototype.when=function(a,b,c,d,e,f,g){this.assimilated||(this.assimilated=!0,this._assimilate()),q.prototype.when.call(this,a,b,c,d,e,f,g)},t.prototype._assimilate=function(){function a(a){d.resolve(a)}function b(a){d.reject(a)}function c(a){d.notify(a)}var d=this;this._try(this.untrustedThen,this.thenable,a,b,c)},t.prototype._try=function(a,b,c,d,e){try{a.call(b,c,d,e)}catch(f){d(f)}},u.prototype=I(o.prototype),u.prototype.inspect=function(){return x(this.value)},u.prototype.when=function(a,b,c,d,e){var f="function"==typeof e?D(e,this.value,d):this.value;a.call(c,f)},v.prototype=I(o.prototype),v.prototype.inspect=function(){return y(this.value)},v.prototype.when=function(a,b,c,d,f,g){this._isMonitored()&&!this.observed&&this._env.promiseMonitor.removeTrace(this.key),this.observed=!0;var h="function"==typeof g?D(g,this.value,d):e(this.value);a.call(c,h)},v.prototype._addTrace=function(a){this.observed||this._env.promiseMonitor.updateTrace(this.key,a)},G=new j(new o),A.prototype.run=function(){this.handler.when(this.a,this.b,this.c,this.d,this.e,this.f,this.g)},B.prototype.run=function(){for(var a=this.q,b=1;b<a.length;b+=7)this._notify(a[b],a[b+1],a[b+2],a[b+5])},B.prototype._notify=function(a,b,c,d){var e="function"==typeof d?E(d,this.value,c):this.value;a.call(b,e)},b}})}("function"==typeof a&&a.amd?a:function(a){c.exports=a()})},{}],6:[function(b,c){!function(a){"use strict";a(function(a){function b(a){this._enqueue=a,this._handlerQueue=new c(15);var b=this;this.drainQueue=function(){b._drainQueue()}}var c=a("./Queue");return b.prototype.enqueue=function(a){1===this._handlerQueue.push(a)&&this._enqueue(this.drainQueue)},b.prototype._drainQueue=function(){for(var a=this._handlerQueue;a.length>0;)a.shift().run()},b})}("function"==typeof a&&a.amd?a:function(a){c.exports=a(b)})},{"./Queue":3}]},{},[1])(1)}),function(global){function __eval(__source,global,__sourceURL,__moduleName){try{eval('var __moduleName = "'+(__moduleName||"").replace('"','"')+'"; with(global) { (function() { '+__source+" \n }).call(global); }"+(__sourceURL&&!__source.match(/\/\/[@#] ?(sourceURL|sourceMappingURL)=([^\n]+)/)?"\n//# sourceURL="+__sourceURL:""))}catch(e){throw"SyntaxError"==e.name&&(e.message="Evaluating "+__sourceURL+"\n	"+e.message),e}}!function(){function a(a){return{status:"loading",name:a,metadata:{},linkSets:[]}}function b(b,d,e,f){return new v(function(a){a(b.normalize(d,e,f))}).then(function(d){var e;if(b._modules[d])return e=a(d),e.status="linked",e;for(var f=0,g=b._loads.length;g>f;f++)if(e=b._loads[f],e.name==d)return e;return e=a(d),b._loads.push(e),c(b,e),e})}function c(a,b){d(a,b,v.resolve().then(function(){return a.locate({name:b.name,metadata:b.metadata})}))}function d(a,b,c){e(a,b,c.then(function(c){return"failed"==b.status?void 0:(b.address=c,a.fetch({name:b.name,metadata:b.metadata,address:c}))}))}function e(a,c,d){d.then(function(b){return"failed"==c.status?void 0:a.translate({name:c.name,metadata:c.metadata,address:c.address,source:b})}).then(function(b){return"failed"==c.status?void 0:(c.source=b,a.instantiate({name:c.name,metadata:c.metadata,address:c.address,source:b}))}).then(function(d){if("failed"==c.status)return void 0;var e;if(void 0===d){if(!global.traceur)throw new TypeError("Include Traceur for module syntax support");t||(t=global.traceur,$traceurRuntime.ModuleStore.get=$traceurRuntime.getModuleImpl=function(a){return System.get(a)}),c.address=c.address||"anon"+ ++z;var f=new t.syntax.Parser(new t.syntax.SourceFile(c.address,c.source));c.body=f.parseModule(),e=r(c.body),c.kind="declarative"}else{if("object"!=typeof d)throw TypeError("Invalid instantiate return value");e=d.deps||[],c.execute=d.execute,c.kind="dynamic"}c.dependencies={},c.depsList=e;for(var h=[],i=0,j=e.length;j>i;i++)(function(d){var e=b(a,d,c.name,c.address);e.then(function(a){if(c.dependencies[d]=a.name,"linked"!=a.status)for(var b=c.linkSets.concat([]),e=0,f=b.length;f>e;e++)g(b[e],a)}),h.push(e)})(e[i]);return v.all(h)}).then(function(){c.status="loaded";for(var a=c.linkSets.concat([]),b=0,d=a.length;d>b;b++)h(a[b],c)},function(a){c.status="failed",c.exception=a;for(var b=0,d=c.linkSets.length;d>b;b++)i(c.linkSets[b],a)})}function f(a,b){var c,d,e=new v(function(a,b){c=a,d=b}),f={loader:a,loads:[],done:e,resolve:c,reject:d,loadingCount:0};return g(f,b),f}function g(a,b){for(var c=0,d=a.loads.length;d>c;c++)if(a.loads[c]==b)return;a.loads.push(b),b.linkSets.push(a),"loaded"!=b.status&&a.loadingCount++;var e=a.loader;for(var f in b.dependencies){var h=b.dependencies[f];if(!e._modules[h])for(var c=0,d=e._loads.length;d>c;c++)if(e._loads[c].name==h){g(a,e._loads[c]);break}}}function h(a,b){if(a.loadingCount--,!(a.loadingCount>0)){var c=a.loads[0];try{o(a.loads,a.loader)}catch(d){return i(a,d)}a.resolve(c)}}function i(a,b){for(var c=a.loads.concat([]),d=0,e=c.length;e>d;d++){var f=c[d],g=x.call(f.linkSets,a);if(f.linkSets.splice(g,1),0==f.linkSets.length){var h=x.call(a.loader._loads,f);-1!=h&&a.loader._loads.splice(h,1)}}a.reject(b)}function j(a,b){b.name&&(a._modules[b.name]=b.module);var c=x.call(a._loads,b);-1!=c&&a._loads.splice(c,1);for(var d=0,e=b.linkSets.length;e>d;d++)c=x.call(b.linkSets[d].loads,b),b.linkSets[d].loads.splice(c,1);b.linkSets=[]}function k(a,b,c){return new v(l(a,b,c&&c.address?"fetch":"locate",void 0,c&&c.address,void 0)).then(function(a){return a})}function l(b,g,h,i,j,k){return function(l,m){if(b._modules[g])throw new TypeError('Module "'+g+'" already exists in the module table');for(var n=0,o=b._loads.length;o>n;n++)if(b._loads[n].name==g)throw new TypeError('Module "'+g+'" is already loading');var p=a(g);i&&(p.metadata=i);var q=f(b,p);b._loads.push(p),q.done.then(l,m),"locate"==h?c(b,p):"fetch"==h?d(b,p,v.resolve(j)):(p.address=j,e(b,p,v.resolve(k)))}}function m(a,b){return n(b.module,a),b.module.module}function n(a,b){if(a.module)return a.module;for(var c in a.dependencies){var d=a.dependencies[c];b._modules[d].module||n(b._modules[d],b)}t.options.sourceMaps=!0,t.options.modules="instantiate";var e=new t.util.ErrorReporter;e.reportMessageInternal=function(a,b){throw b+"\n"+a};var f=global.System;global.System=global.traceurSystem;var g=new t.codegeneration.module.AttachModuleNameTransformer(a.name).transformAny(a.body);g=new t.codegeneration.FromOptionsTransformer(e).transform(g),global.System=f,delete a.body;var h=new t.outputgeneration.SourceMapGenerator({file:a.address}),i={sourceMapGenerator:h},j=t.outputgeneration.TreeWriter.write(g,i);global.btoa&&(j+="\n//# sourceMappingURL=data:application/json;base64,"+btoa(unescape(encodeURIComponent(i.sourceMap)))+"\n");var k=System.register;System.register=function(b,c,d){for(var e=0;e<c.length;e++)c[e]=a.dependencies[c[e]];a.module=new s(d.apply(global,c))},__eval(j,global,a.address,a.name),System.register=k}function o(a,b){for(var c=!1;a.length;){c=!0;a:for(var d=0;d<a.length;d++){var e=a[d],f=[];for(var g in e.dependencies){var h=e.dependencies[g];if(!b._modules[h])continue a;var i=x.call(e.depsList,g);f[i]=h}if(c=!1,"declarative"==e.kind)e.module={name:e.name,dependencies:e.dependencies,body:e.body};else{var k=e.execute.apply(null,f);if(!(k instanceof s))throw new TypeError("Execution must define a Module instance");e.module={module:k}}e.status="linked",j(b,e)}if(c)throw new TypeError("Circular dependencies not supported by the polyfill")}}function p(a){if("object"!=typeof a)throw new TypeError("Options must be an object");a.normalize&&(this.normalize=a.normalize),a.locate&&(this.locate=a.locate),a.fetch&&(this.fetch=a.fetch),a.translate&&(this.translate=a.translate),a.instantiate&&(this.instantiate=a.instantiate),u(this,"global",{get:function(){throw new TypeError("global accessor not provided by polyfill")}}),u(this,"realm",{get:function(){throw new TypeError("Realms not implemented in polyfill")}}),this._modules={},this._loads=[]}function q(a,b,c,d){var e,f;if(b(a,c,d)!==!1)for(e in a)a.hasOwnProperty(e)&&"location"!=e&&"type"!=e&&(f=a[e],"object"==typeof f&&null!==f&&q(f,b,a,e))}function r(a){function b(a){-1==x.call(c,a)&&c.push(a)}var c=[];return q(a,function(a){"EXPORT_DECLARATION"==a.type?a.declaration.moduleSpecifier&&b(a.declaration.moduleSpecifier.token.processedValue):"IMPORT_DECLARATION"==a.type?b(a.moduleSpecifier.token.processedValue):"MODULE_DECLARATION"==a.type&&b(a.expression.token.processedValue)}),c}function s(a){if("object"!=typeof a)throw new TypeError("Expected object");if(!(this instanceof s))return new s(a);var b=this;for(var c in a)!function(a,c){u(b,a,{configurable:!1,enumerable:!0,get:function(){return c}})}(c,a[c]);Object.preventExtensions&&Object.preventExtensions(this)}var t,u,v=global.Promise||require("./promise");try{Object.defineProperty({},"a",{})&&(u=Object.defineProperty)}catch(w){u=function(a,b,c){try{a[b]=c.value||c.get.call(a)}catch(d){}}}console.assert=console.assert||function(){};var x=Array.prototype.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},y={};p.prototype={define:function(a,b,c){if(y[a])throw new TypeError("Module is already loading.");return y[a]=new v(l(this,a,c&&c.address?"fetch":"translate",c&&c.meta||{},c&&c.address,b)),y[a].then(function(){delete y[a]})},load:function(a,b){return this._modules[a]?(n(this._modules[a],this),v.resolve(this._modules[a].module)):y[a]?y[a]:(y[a]=k(this,a,b),y[a].then(function(){delete y[a]}))},module:function(b,c){var d=a();d.address=c&&c.address;var g=f(this,d),h=v.resolve(b),i=this,j=g.done.then(function(){return m(i,d)});return e(this,d,h),j},"import":function(a,b){if(this._modules[a])return n(this._modules[a],this),v.resolve(this._modules[a].module);var c=this;return(y[a]||(y[a]=k(this,a,b))).then(function(b){return delete y[a],m(c,b)})},eval:function(){throw new TypeError("Eval not implemented in polyfill")},get:function(a){return n(this._modules[a],this),this._modules[a].module},has:function(a){return!!this._modules[a]},set:function(a,b){if(!(b instanceof s))throw new TypeError("Set must be a module");this._modules[a]={module:b}},"delete":function(a){return this._modules[a]?delete this._modules[a]:!1},entries:function(){throw new TypeError("Iteration not yet implemented in the polyfill")},keys:function(){throw new TypeError("Iteration not yet implemented in the polyfill")},values:function(){throw new TypeError("Iteration not yet implemented in the polyfill")},normalize:function(a){return a},locate:function(a){return a.name},fetch:function(){throw new TypeError("Fetch not implemented")},translate:function(a){return a.source},instantiate:function(){}};var z=0;"object"==typeof exports&&(module.exports=p),global.Loader||(global.Loader=p),global.LoaderPolyfill=p,global.Module=s}()}("undefined"!=typeof global?global:this),function(a){function b(a){var b=String(a).replace(/^\s+|\s+$/g,"").match(/^([^:\/?#]+:)?(\/\/(?:[^:@]*(?::[^:@]*)?@)?(([^:\/?#]*)(?::(\d*))?))?([^?#]*)(\?[^#]*)?(#[\s\S]*)?/);return b?{href:b[0]||"",protocol:b[1]||"",authority:b[2]||"",host:b[3]||"",hostname:b[4]||"",port:b[5]||"",pathname:b[6]||"",search:b[7]||"",hash:b[8]||""}:null}function c(a,c){function d(a){var b=[];return a.replace(/^(\.\.?(\/|$))+/,"").replace(/\/(\.(\/|$))+/g,"/").replace(/\/\.\.$/,"/../").replace(/\/?[^\/]*/g,function(a){"/.."===a?b.pop():b.push(a)}),b.join("").replace(/^\//,"/"===a.charAt(0)?"/":"")}return c=b(c||""),a=b(a||""),c&&a?(c.protocol||a.protocol)+(c.protocol||c.authority?c.authority:a.authority)+d(c.protocol||c.authority||"/"===c.pathname.charAt(0)?c.pathname:c.pathname?(a.authority&&!a.pathname?"/":"")+a.pathname.slice(0,a.pathname.lastIndexOf("/")+1)+c.pathname:a.pathname)+(c.protocol||c.authority||c.pathname?c.search:c.search||a.search)+c.hash:null}function d(){document.removeEventListener("DOMContentLoaded",d,!1),window.removeEventListener("load",d,!1),e()}function e(){for(var a=document.getElementsByTagName("script"),b=0;b<a.length;b++){var c=a[b];if("module"==c.type){var d=c.getAttribute("name"),e=c.getAttribute("src"),f=c.innerHTML;(d?k.define(d,f,{address:e}):k.module(f,{address:e})).then(function(){},function(a){nextTick(function(){throw a})})}}}var f,g="undefined"!=typeof window,h=a.Loader||require("./loader"),i=a.Promise||require("./promise");if(g)f=function(a,b,c){function d(){b(f.responseText)}function e(){c(f.statusText+": "+a||"XHR error")}var f=new XMLHttpRequest,g=!0;if(!("withCredentials"in f)){var h=/^(\w+:)?\/\/([^\/]+)/.exec(a);h&&(g=h[2]===window.location.host,h[1]&&(g&=h[1]===window.location.protocol))}g||(f=new XDomainRequest,f.onload=d,f.onerror=e,f.ontimeout=e),f.onreadystatechange=function(){4===f.readyState&&(200===f.status||0==f.status&&f.responseText?d():e())},f.open("GET",a,!0),f.send(null)};else{var j=require("fs");f=function(a,b,c){return j.readFile(a,function(a,d){return a?c(a):(b(d+""),void 0)})}}var k=new h({global:g?window:a,strict:!0,normalize:function(a,b){if("string"!=typeof a)throw new TypeError("Module name must be a string");var c=a.split("/");if(0==c.length)throw new TypeError("No module name provided");var d=0,e=!1,f=0;if("."==c[0]){if(d++,d==c.length)throw new TypeError('Illegal module name "'+a+'"');e=!0}else{for(;".."==c[d];)if(d++,d==c.length)throw new TypeError('Illegal module name "'+a+'"');d&&(e=!0),f=d}for(var g=d;g<c.length;g++){var h=c[g];if(""==h||"."==h||".."==h)throw new TypeError('Illegal module name"'+a+'"')}if(!e)return a;{var i=[],j=(b||"").split("/");j.length-1-f}return i=i.concat(j.splice(0,j.length-1-f)),i=i.concat(c.splice(d,c.length-d)),i.join("/")},locate:function(a){var b,d=a.name,e="";for(var f in this.paths){var g=f.split("*");if(g.length>2)throw new TypeError("Only one wildcard in a path is permitted");1==g.length?d==f&&f.length>e.length&&(e=f):d.substr(0,g[0].length)==g[0]&&d.substr(d.length-g[1].length)==g[1]&&(e=f,b=d.substr(g[0].length,d.length-g[1].length-g[0].length))}var h=this.paths[e];return b&&(h=h.replace("*",b)),c(this.baseURL,h)},fetch:function(a){var b,d,e=new i(function(a,c){b=a,d=c});return f(c(this.baseURL,a.address),function(a){b(a)},d),e}});if(g){var l=window.location.href.split("#")[0].split("?")[0];k.baseURL=l.substring(0,l.lastIndexOf("/")+1)}else k.baseURL="./";if(k.paths={"*":"*.js"},a.System&&a.traceur&&(a.traceurSystem=a.System),a.System=k,g){var m=document.getElementsByTagName("script");m=m[m.length-1],"complete"===document.readyState?setTimeout(e):document.addEventListener&&(document.addEventListener("DOMContentLoaded",d,!1),window.addEventListener("load",d,!1)),m.getAttribute("data-init")&&window[m.getAttribute("data-init")]()}"object"==typeof exports&&(module.exports=k)}("undefined"!=typeof global?global:this);
\ No newline at end of file
diff --git a/examples/pipetobrowser/browser/libs/vendor/polymer/platform/AUTHORS b/examples/pipetobrowser/browser/libs/vendor/polymer/platform/AUTHORS
new file mode 100644
index 0000000..0617765
--- /dev/null
+++ b/examples/pipetobrowser/browser/libs/vendor/polymer/platform/AUTHORS
@@ -0,0 +1,9 @@
+# Names should be added to this file with this pattern:
+#
+# For individuals:
+#   Name <email address>
+#
+# For organizations:
+#   Organization <fnmatch pattern>
+#
+Google Inc. <*@google.com>
diff --git a/examples/pipetobrowser/browser/libs/vendor/polymer/platform/CONTRIBUTING.md b/examples/pipetobrowser/browser/libs/vendor/polymer/platform/CONTRIBUTING.md
new file mode 100644
index 0000000..1de2f34
--- /dev/null
+++ b/examples/pipetobrowser/browser/libs/vendor/polymer/platform/CONTRIBUTING.md
@@ -0,0 +1,73 @@
+# Contributing
+
+Want to contribute to Polymer? Great!
+
+We are more than happy to accept external contributions to the project in the form of [feedback](https://groups.google.com/forum/?fromgroups=#!forum/polymer-dev), [bug reports](../../issues), and pull requests.
+
+## Contributor License Agreement
+
+Before we can accept patches, there's a quick web form you need to fill out.
+
+- If you're contributing as an individual (e.g. you own the intellectual property), fill out [this form](http://code.google.com/legal/individual-cla-v1.0.html).
+- If you're contributing under a company, fill out [this form](http://code.google.com/legal/corporate-cla-v1.0.html) instead.
+
+This CLA asserts that contributions are owned by you and that we can license all work under our [license](LICENSE).
+
+Other projects require a similar agreement: jQuery, Firefox, Apache, Node, and many more.
+
+[More about CLAs](https://www.google.com/search?q=Contributor%20License%20Agreement)
+
+## Initial setup
+
+Here's an easy guide that should get you up and running:
+
+1. Setup Grunt: `sudo npm install -g grunt-cli`
+1. Fork the project on github and pull down your copy.
+   > replace the {{ username }} with your username and {{ repository }} with the repository name
+
+        git clone git@github.com:{{ username }}/{{ repository }}.git --recursive
+
+    Note the `--recursive`. This is necessary for submodules to initialize properly. If you don't do a recursive clone, you'll have to init them manually:
+
+        git submodule init
+        git submodule update
+
+    Download and run the `pull-all.sh` script to install the sibling dependencies.
+
+        git clone git://github.com/Polymer/tools.git && tools/bin/pull-all.sh
+
+1. Test your change
+   > in the repo you've made changes to, run the tests:
+
+        cd $REPO
+        npm install
+        grunt test
+
+1. Commit your code and make a pull request.
+
+That's it for the one time setup. Now you're ready to make a change.
+
+## Submitting a pull request
+
+We iterate fast! To avoid potential merge conflicts, it's a good idea to pull from the main project before making a change and submitting a pull request. The easiest way to do this is setup a remote called `upstream` and do a pull before working on a change:
+
+    git remote add upstream git://github.com/Polymer/{{ repository }}.git
+
+Then before making a change, do a pull from the upstream `master` branch:
+
+    git pull upstream master
+
+To make life easier, add a "pull upstream" alias in your `.gitconfig`:
+
+    [alias]
+      pu = !"git fetch origin -v; git fetch upstream -v; git merge upstream/master"
+
+That will pull in changes from your forked repo, the main (upstream) repo, and merge the two. Then it's just a matter of running `git pu` before a change and pushing to your repo:
+
+    git checkout master
+    git pu
+    # make change
+    git commit -a -m 'Awesome things.'
+    git push
+
+Lastly, don't forget to submit the pull request.
diff --git a/examples/pipetobrowser/browser/libs/vendor/polymer/platform/LICENSE b/examples/pipetobrowser/browser/libs/vendor/polymer/platform/LICENSE
new file mode 100644
index 0000000..92d60b0
--- /dev/null
+++ b/examples/pipetobrowser/browser/libs/vendor/polymer/platform/LICENSE
@@ -0,0 +1,27 @@
+// Copyright (c) 2012 The Polymer Authors. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//    * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//    * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//    * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/examples/pipetobrowser/browser/libs/vendor/polymer/platform/PATENTS b/examples/pipetobrowser/browser/libs/vendor/polymer/platform/PATENTS
new file mode 100644
index 0000000..e120963
--- /dev/null
+++ b/examples/pipetobrowser/browser/libs/vendor/polymer/platform/PATENTS
@@ -0,0 +1,23 @@
+Additional IP Rights Grant (Patents)
+
+"This implementation" means the copyrightable works distributed by
+Google as part of the Polymer project.
+
+Google hereby grants to You a perpetual, worldwide, non-exclusive,
+no-charge, royalty-free, irrevocable (except as stated in this section)
+patent license to make, have made, use, offer to sell, sell, import,
+transfer and otherwise run, modify and propagate the contents of this
+implementation of Polymer, where such license applies only to those
+patent claims, both currently owned or controlled by Google and acquired
+in the future, licensable by Google that are necessarily infringed by
+this implementation of Polymer.  This grant does not include claims
+that would be infringed only as a consequence of further modification of
+this implementation.  If you or your agent or exclusive licensee
+institute or order or agree to the institution of patent litigation
+against any entity (including a cross-claim or counterclaim in a
+lawsuit) alleging that this implementation of Polymer or any code
+incorporated within this implementation of Polymer constitutes
+direct or contributory patent infringement, or inducement of patent
+infringement, then any patent rights granted to you under this License
+for this implementation of Polymer shall terminate as of the date
+such litigation is filed.
diff --git a/examples/pipetobrowser/browser/libs/vendor/polymer/platform/README.md b/examples/pipetobrowser/browser/libs/vendor/polymer/platform/README.md
new file mode 100644
index 0000000..65b661e
--- /dev/null
+++ b/examples/pipetobrowser/browser/libs/vendor/polymer/platform/README.md
@@ -0,0 +1,6 @@
+Platform
+========
+
+Aggregated polyfills the Polymer platform. 
+
+[![Analytics](https://ga-beacon.appspot.com/UA-39334307-2/Polymer/platform/README)](https://github.com/igrigorik/ga-beacon)
diff --git a/examples/pipetobrowser/browser/libs/vendor/polymer/platform/bower.json b/examples/pipetobrowser/browser/libs/vendor/polymer/platform/bower.json
new file mode 100644
index 0000000..b8bcbb5
--- /dev/null
+++ b/examples/pipetobrowser/browser/libs/vendor/polymer/platform/bower.json
@@ -0,0 +1,17 @@
+{
+  "name": "platform",
+  "main": "platform.js",
+  "homepage": "https://github.com/Polymer/platform",
+  "authors": [
+    "The Polymer Authors"
+  ],
+  "description": "Integrate platform polyfills: load, build, test",
+  "keywords": [
+    "polymer",
+    "web",
+    "components"
+  ],
+  "license": "BSD",
+  "private": true,
+  "version": "0.2.3"
+}
\ No newline at end of file
diff --git a/examples/pipetobrowser/browser/libs/vendor/polymer/platform/build.log b/examples/pipetobrowser/browser/libs/vendor/polymer/platform/build.log
new file mode 100644
index 0000000..ea9e9a9
--- /dev/null
+++ b/examples/pipetobrowser/browser/libs/vendor/polymer/platform/build.log
@@ -0,0 +1,40 @@
+BUILD LOG
+---------
+Build Time: 2014-04-18T13:25:05
+
+NODEJS INFORMATION
+==================
+nodejs: v0.10.26
+grunt: 0.4.4
+grunt-audit: 0.0.3
+grunt-concat-sourcemap: 0.4.1
+grunt-contrib-concat: 0.4.0
+grunt-contrib-uglify: 0.4.0
+grunt-contrib-yuidoc: 0.5.2
+grunt-karma: 0.8.2
+karma: 0.12.2
+chai: 1.9.1
+karma-chrome-launcher: 0.0.2
+karma-mocha: 0.1.3
+karma-ie-launcher: 0.1.5
+karma-crbot-reporter: 0.0.4
+karma-script-launcher: 0.1.0
+mocha: 1.18.2
+karma-safari-launcher: 0.1.1
+karma-firefox-launcher: 0.1.3
+Platform: 0.2.3
+
+REPO REVISIONS
+==============
+CustomElements: 9b997ca97533147f5f17bd666c06e5fa1a13219e
+HTMLImports: 1c796ecc75d8895f50e65160c53f00a875cb9d2b
+NodeBind: c47bc1b40d1cf0123b29620820a7111471e83ff3
+ShadowDOM: ea4371633cd54dc8f65245d3c65268028bc3e2aa
+TemplateBinding: 1cee027fe67680c93ff2b6b070d32708226f6a83
+WeakMap: a0947a9a0f58f5733f464755c3b86de624b00a5d
+observe-js: c57f0e04f857fee6889468d959ab8233df1d5b31
+platform-dev: c90023a27c38f0e62123e07bdc0639b5336396ee
+
+BUILD HASHES
+============
+build/platform.js: 1238c0a208ca35d679efbf22cd0ad1d1b266464d
\ No newline at end of file
diff --git a/examples/pipetobrowser/browser/libs/vendor/polymer/platform/platform.js b/examples/pipetobrowser/browser/libs/vendor/polymer/platform/platform.js
new file mode 100644
index 0000000..8448813
--- /dev/null
+++ b/examples/pipetobrowser/browser/libs/vendor/polymer/platform/platform.js
@@ -0,0 +1,17 @@
+/**
+ * @license
+ * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
+ * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+ * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+ * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+ * Code distributed by Google as part of the polymer project is also
+ * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+ */
+// @version: 0.2.3
+
+window.Platform=window.Platform||{},window.logFlags=window.logFlags||{},function(a){var b=a.flags||{};location.search.slice(1).split("&").forEach(function(a){a=a.split("="),a[0]&&(b[a[0]]=a[1]||!0)});var c=document.currentScript||document.querySelector('script[src*="platform.js"]');if(c)for(var d,e=c.attributes,f=0;f<e.length;f++)d=e[f],"src"!==d.name&&(b[d.name]=d.value||!0);b.log&&b.log.split(",").forEach(function(a){window.logFlags[a]=!0}),b.shadow=b.shadow||b.shadowdom||b.polyfill,b.shadow="native"===b.shadow?!1:b.shadow||!HTMLElement.prototype.createShadowRoot,b.shadow&&document.querySelectorAll("script").length>1&&console.warn("platform.js is not the first script on the page. See http://www.polymer-project.org/docs/start/platform.html#setup for details."),b.register&&(window.CustomElements=window.CustomElements||{flags:{}},window.CustomElements.flags.register=b.register),b.imports&&(window.HTMLImports=window.HTMLImports||{flags:{}},window.HTMLImports.flags.imports=b.imports),a.flags=b}(Platform),"undefined"==typeof WeakMap&&!function(){var a=Object.defineProperty,b=Date.now()%1e9,c=function(){this.name="__st"+(1e9*Math.random()>>>0)+(b++ +"__")};c.prototype={set:function(b,c){var d=b[this.name];d&&d[0]===b?d[1]=c:a(b,this.name,{value:[b,c],writable:!0})},get:function(a){var b;return(b=a[this.name])&&b[0]===a?b[1]:void 0},"delete":function(a){this.set(a,void 0)}},window.WeakMap=c}(),function(global){"use strict";function detectObjectObserve(){function a(a){b=a}if("function"!=typeof Object.observe||"function"!=typeof Array.observe)return!1;var b=[],c={},d=[];return Object.observe(c,a),Array.observe(d,a),c.id=1,c.id=2,delete c.id,d.push(1,2),d.length=0,Object.deliverChangeRecords(a),5!==b.length?!1:"add"!=b[0].type||"update"!=b[1].type||"delete"!=b[2].type||"splice"!=b[3].type||"splice"!=b[4].type?!1:(Object.unobserve(c,a),Array.unobserve(d,a),!0)}function detectEval(){if(global.document&&"securityPolicy"in global.document&&!global.document.securityPolicy.allowsEval)return!1;if("undefined"!=typeof chrome&&chrome.app&&chrome.app.runtime)return!1;try{var a=new Function("","return true;");return a()}catch(b){return!1}}function isIndex(a){return+a===a>>>0}function toNumber(a){return+a}function isObject(a){return a===Object(a)}function areSameValue(a,b){return a===b?0!==a||1/a===1/b:numberIsNaN(a)&&numberIsNaN(b)?!0:a!==a&&b!==b}function isPathValid(a){return"string"!=typeof a?!1:(a=a.trim(),""==a?!0:"."==a[0]?!1:pathRegExp.test(a))}function Path(a,b){if(b!==constructorIsPrivate)throw Error("Use Path.get to retrieve path objects");return""==a.trim()?this:isIndex(a)?(this.push(a),this):(a.split(/\s*\.\s*/).filter(function(a){return a}).forEach(function(a){this.push(a)},this),void(hasEval&&this.length&&(this.getValueFrom=this.compiledGetValueFromFn())))}function getPath(a){if(a instanceof Path)return a;null==a&&(a=""),"string"!=typeof a&&(a=String(a));var b=pathCache[a];if(b)return b;if(!isPathValid(a))return invalidPath;var b=new Path(a,constructorIsPrivate);return pathCache[a]=b,b}function dirtyCheck(a){for(var b=0;MAX_DIRTY_CHECK_CYCLES>b&&a.check_();)b++;return global.testingExposeCycleCount&&(global.dirtyCheckCycleCount=b),b>0}function objectIsEmpty(a){for(var b in a)return!1;return!0}function diffIsEmpty(a){return objectIsEmpty(a.added)&&objectIsEmpty(a.removed)&&objectIsEmpty(a.changed)}function diffObjectFromOldObject(a,b){var c={},d={},e={};for(var f in b){var g=a[f];(void 0===g||g!==b[f])&&(f in a?g!==b[f]&&(e[f]=g):d[f]=void 0)}for(var f in a)f in b||(c[f]=a[f]);return Array.isArray(a)&&a.length!==b.length&&(e.length=a.length),{added:c,removed:d,changed:e}}function runEOMTasks(){if(!eomTasks.length)return!1;for(var a=0;a<eomTasks.length;a++)eomTasks[a]();return eomTasks.length=0,!0}function newObservedObject(){function a(a){b&&b.state_===OPENED&&!d&&b.check_(a)}var b,c,d=!1,e=!0;return{open:function(c){if(b)throw Error("ObservedObject in use");e||Object.deliverChangeRecords(a),b=c,e=!1},observe:function(b,d){c=b,d?Array.observe(c,a):Object.observe(c,a)},deliver:function(b){d=b,Object.deliverChangeRecords(a),d=!1},close:function(){b=void 0,Object.unobserve(c,a),observedObjectCache.push(this)}}}function getObservedObject(a,b,c){var d=observedObjectCache.pop()||newObservedObject();return d.open(a),d.observe(b,c),d}function newObservedSet(){function a(b,f){b&&(b===d&&(e[f]=!0),h.indexOf(b)<0&&(h.push(b),Object.observe(b,c)),a(Object.getPrototypeOf(b),f))}function b(a){for(var b=0;b<a.length;b++){var c=a[b];if(c.object!==d||e[c.name]||"setPrototype"===c.type)return!1}return!0}function c(c){if(!b(c)){for(var d,e=0;e<g.length;e++)d=g[e],d.state_==OPENED&&d.iterateObjects_(a);for(var e=0;e<g.length;e++)d=g[e],d.state_==OPENED&&d.check_()}}var d,e,f=0,g=[],h=[],i={object:void 0,objects:h,open:function(b,c){d||(d=c,e={}),g.push(b),f++,b.iterateObjects_(a)},close:function(){if(f--,!(f>0)){for(var a=0;a<h.length;a++)Object.unobserve(h[a],c),Observer.unobservedCount++;g.length=0,h.length=0,d=void 0,e=void 0,observedSetCache.push(this)}}};return i}function getObservedSet(a,b){return lastObservedSet&&lastObservedSet.object===b||(lastObservedSet=observedSetCache.pop()||newObservedSet(),lastObservedSet.object=b),lastObservedSet.open(a,b),lastObservedSet}function Observer(){this.state_=UNOPENED,this.callback_=void 0,this.target_=void 0,this.directObserver_=void 0,this.value_=void 0,this.id_=nextObserverId++}function addToAll(a){Observer._allObserversCount++,collectObservers&&allObservers.push(a)}function removeFromAll(){Observer._allObserversCount--}function ObjectObserver(a){Observer.call(this),this.value_=a,this.oldObject_=void 0}function ArrayObserver(a){if(!Array.isArray(a))throw Error("Provided object is not an Array");ObjectObserver.call(this,a)}function PathObserver(a,b){Observer.call(this),this.object_=a,this.path_=getPath(b),this.directObserver_=void 0}function CompoundObserver(a){Observer.call(this),this.reportChangesOnOpen_=a,this.value_=[],this.directObserver_=void 0,this.observed_=[]}function identFn(a){return a}function ObserverTransform(a,b,c,d){this.callback_=void 0,this.target_=void 0,this.value_=void 0,this.observable_=a,this.getValueFn_=b||identFn,this.setValueFn_=c||identFn,this.dontPassThroughSet_=d}function notify(a,b,c,d){if(!areSameValue(c,d)&&("function"==typeof a.propertyChanged_&&a.propertyChanged_(b,c,d),hasObserve)){var e=a.notifier_;e||(e=a.notifier_=Object.getNotifier(a)),updateRecord.object=a,updateRecord.name=b,updateRecord.oldValue=d,e.notify(updateRecord)}}function diffObjectFromChangeRecords(a,b,c){for(var d={},e={},f=0;f<b.length;f++){var g=b[f];expectedRecordTypes[g.type]?(g.name in c||(c[g.name]=g.oldValue),"update"!=g.type&&("add"!=g.type?g.name in d?(delete d[g.name],delete c[g.name]):e[g.name]=!0:g.name in e?delete e[g.name]:d[g.name]=!0)):(console.error("Unknown changeRecord type: "+g.type),console.error(g))}for(var h in d)d[h]=a[h];for(var h in e)e[h]=void 0;var i={};for(var h in c)if(!(h in d||h in e)){var j=a[h];c[h]!==j&&(i[h]=j)}return{added:d,removed:e,changed:i}}function newSplice(a,b,c){return{index:a,removed:b,addedCount:c}}function ArraySplice(){}function calcSplices(a,b,c,d,e,f){return arraySplice.calcSplices(a,b,c,d,e,f)}function intersect(a,b,c,d){return c>b||a>d?-1:b==c||d==a?0:c>a?d>b?b-c:d-c:b>d?d-a:b-a}function mergeSplice(a,b,c,d){for(var e=newSplice(b,c,d),f=!1,g=0,h=0;h<a.length;h++){var i=a[h];if(i.index+=g,!f){var j=intersect(e.index,e.index+e.removed.length,i.index,i.index+i.addedCount);if(j>=0){a.splice(h,1),h--,g-=i.addedCount-i.removed.length,e.addedCount+=i.addedCount-j;var k=e.removed.length+i.removed.length-j;if(e.addedCount||k){var c=i.removed;if(e.index<i.index){var l=e.removed.slice(0,i.index-e.index);Array.prototype.push.apply(l,c),c=l}if(e.index+e.removed.length>i.index+i.addedCount){var m=e.removed.slice(i.index+i.addedCount-e.index);Array.prototype.push.apply(c,m)}e.removed=c,i.index<e.index&&(e.index=i.index)}else f=!0}else if(e.index<i.index){f=!0,a.splice(h,0,e),h++;var n=e.addedCount-e.removed.length;i.index+=n,g+=n}}}f||a.push(e)}function createInitialSplices(a,b){for(var c=[],d=0;d<b.length;d++){var e=b[d];switch(e.type){case"splice":mergeSplice(c,e.index,e.removed.slice(),e.addedCount);break;case"add":case"update":case"delete":if(!isIndex(e.name))continue;var f=toNumber(e.name);if(0>f)continue;mergeSplice(c,f,[e.oldValue],1);break;default:console.error("Unexpected record type: "+JSON.stringify(e))}}return c}function projectArraySplices(a,b){var c=[];return createInitialSplices(a,b).forEach(function(b){return 1==b.addedCount&&1==b.removed.length?void(b.removed[0]!==a[b.index]&&c.push(b)):void(c=c.concat(calcSplices(a,b.index,b.index+b.addedCount,b.removed,0,b.removed.length)))}),c}var hasObserve=detectObjectObserve(),hasEval=detectEval(),numberIsNaN=global.Number.isNaN||function(a){return"number"==typeof a&&global.isNaN(a)},createObject="__proto__"in{}?function(a){return a}:function(a){var b=a.__proto__;if(!b)return a;var c=Object.create(b);return Object.getOwnPropertyNames(a).forEach(function(b){Object.defineProperty(c,b,Object.getOwnPropertyDescriptor(a,b))}),c},identStart="[$_a-zA-Z]",identPart="[$_a-zA-Z0-9]",ident=identStart+"+"+identPart+"*",elementIndex="(?:[0-9]|[1-9]+[0-9]+)",identOrElementIndex="(?:"+ident+"|"+elementIndex+")",path="(?:"+identOrElementIndex+")(?:\\s*\\.\\s*"+identOrElementIndex+")*",pathRegExp=new RegExp("^"+path+"$"),constructorIsPrivate={},pathCache={};Path.get=getPath,Path.prototype=createObject({__proto__:[],valid:!0,toString:function(){return this.join(".")},getValueFrom:function(a){for(var b=0;b<this.length;b++){if(null==a)return;a=a[this[b]]}return a},iterateObjects:function(a,b){for(var c=0;c<this.length;c++){if(c&&(a=a[this[c-1]]),!isObject(a))return;b(a,this[0])}},compiledGetValueFromFn:function(){var a=this.map(function(a){return isIndex(a)?'["'+a+'"]':"."+a}),b="",c="obj";b+="if (obj != null";for(var d=0;d<this.length-1;d++){{this[d]}c+=a[d],b+=" &&\n     "+c+" != null"}return b+=")\n",c+=a[d],b+="  return "+c+";\nelse\n  return undefined;",new Function("obj",b)},setValueFrom:function(a,b){if(!this.length)return!1;for(var c=0;c<this.length-1;c++){if(!isObject(a))return!1;a=a[this[c]]}return isObject(a)?(a[this[c]]=b,!0):!1}});var invalidPath=new Path("",constructorIsPrivate);invalidPath.valid=!1,invalidPath.getValueFrom=invalidPath.setValueFrom=function(){};var MAX_DIRTY_CHECK_CYCLES=1e3,eomTasks=[],runEOM=hasObserve?function(){var a={pingPong:!0},b=!1;return Object.observe(a,function(){runEOMTasks(),b=!1}),function(c){eomTasks.push(c),b||(b=!0,a.pingPong=!a.pingPong)}}():function(){return function(a){eomTasks.push(a)}}(),observedObjectCache=[],observedSetCache=[],lastObservedSet,UNOPENED=0,OPENED=1,CLOSED=2,RESETTING=3,nextObserverId=1;Observer.prototype={open:function(a,b){if(this.state_!=UNOPENED)throw Error("Observer has already been opened.");return addToAll(this),this.callback_=a,this.target_=b,this.connect_(),this.state_=OPENED,this.value_},close:function(){this.state_==OPENED&&(removeFromAll(this),this.disconnect_(),this.value_=void 0,this.callback_=void 0,this.target_=void 0,this.state_=CLOSED)},deliver:function(){this.state_==OPENED&&dirtyCheck(this)},report_:function(a){try{this.callback_.apply(this.target_,a)}catch(b){Observer._errorThrownDuringCallback=!0,console.error("Exception caught during observer callback: "+(b.stack||b))}},discardChanges:function(){return this.check_(void 0,!0),this.value_}};var collectObservers=!hasObserve,allObservers;Observer._allObserversCount=0,collectObservers&&(allObservers=[]);var runningMicrotaskCheckpoint=!1,hasDebugForceFullDelivery=hasObserve&&function(){try{return eval("%RunMicrotasks()"),!0}catch(ex){return!1}}();global.Platform=global.Platform||{},global.Platform.performMicrotaskCheckpoint=function(){if(!runningMicrotaskCheckpoint){if(hasDebugForceFullDelivery)return void eval("%RunMicrotasks()");if(collectObservers){runningMicrotaskCheckpoint=!0;var cycles=0,anyChanged,toCheck;do{cycles++,toCheck=allObservers,allObservers=[],anyChanged=!1;for(var i=0;i<toCheck.length;i++){var observer=toCheck[i];observer.state_==OPENED&&(observer.check_()&&(anyChanged=!0),allObservers.push(observer))}runEOMTasks()&&(anyChanged=!0)}while(MAX_DIRTY_CHECK_CYCLES>cycles&&anyChanged);global.testingExposeCycleCount&&(global.dirtyCheckCycleCount=cycles),runningMicrotaskCheckpoint=!1}}},collectObservers&&(global.Platform.clearObservers=function(){allObservers=[]}),ObjectObserver.prototype=createObject({__proto__:Observer.prototype,arrayObserve:!1,connect_:function(){hasObserve?this.directObserver_=getObservedObject(this,this.value_,this.arrayObserve):this.oldObject_=this.copyObject(this.value_)},copyObject:function(a){var b=Array.isArray(a)?[]:{};for(var c in a)b[c]=a[c];return Array.isArray(a)&&(b.length=a.length),b},check_:function(a){var b,c;if(hasObserve){if(!a)return!1;c={},b=diffObjectFromChangeRecords(this.value_,a,c)}else c=this.oldObject_,b=diffObjectFromOldObject(this.value_,this.oldObject_);return diffIsEmpty(b)?!1:(hasObserve||(this.oldObject_=this.copyObject(this.value_)),this.report_([b.added||{},b.removed||{},b.changed||{},function(a){return c[a]}]),!0)},disconnect_:function(){hasObserve?(this.directObserver_.close(),this.directObserver_=void 0):this.oldObject_=void 0},deliver:function(){this.state_==OPENED&&(hasObserve?this.directObserver_.deliver(!1):dirtyCheck(this))},discardChanges:function(){return this.directObserver_?this.directObserver_.deliver(!0):this.oldObject_=this.copyObject(this.value_),this.value_}}),ArrayObserver.prototype=createObject({__proto__:ObjectObserver.prototype,arrayObserve:!0,copyObject:function(a){return a.slice()},check_:function(a){var b;if(hasObserve){if(!a)return!1;b=projectArraySplices(this.value_,a)}else b=calcSplices(this.value_,0,this.value_.length,this.oldObject_,0,this.oldObject_.length);return b&&b.length?(hasObserve||(this.oldObject_=this.copyObject(this.value_)),this.report_([b]),!0):!1}}),ArrayObserver.applySplices=function(a,b,c){c.forEach(function(c){for(var d=[c.index,c.removed.length],e=c.index;e<c.index+c.addedCount;)d.push(b[e]),e++;Array.prototype.splice.apply(a,d)})},PathObserver.prototype=createObject({__proto__:Observer.prototype,connect_:function(){hasObserve&&(this.directObserver_=getObservedSet(this,this.object_)),this.check_(void 0,!0)},disconnect_:function(){this.value_=void 0,this.directObserver_&&(this.directObserver_.close(this),this.directObserver_=void 0)},iterateObjects_:function(a){this.path_.iterateObjects(this.object_,a)},check_:function(a,b){var c=this.value_;return this.value_=this.path_.getValueFrom(this.object_),b||areSameValue(this.value_,c)?!1:(this.report_([this.value_,c]),!0)},setValue:function(a){this.path_&&this.path_.setValueFrom(this.object_,a)}});var observerSentinel={};CompoundObserver.prototype=createObject({__proto__:Observer.prototype,connect_:function(){if(hasObserve){for(var a,b=!1,c=0;c<this.observed_.length;c+=2)if(a=this.observed_[c],a!==observerSentinel){b=!0;break}b&&(this.directObserver_=getObservedSet(this,a))}this.check_(void 0,!this.reportChangesOnOpen_)},disconnect_:function(){for(var a=0;a<this.observed_.length;a+=2)this.observed_[a]===observerSentinel&&this.observed_[a+1].close();this.observed_.length=0,this.value_.length=0,this.directObserver_&&(this.directObserver_.close(this),this.directObserver_=void 0)},addPath:function(a,b){if(this.state_!=UNOPENED&&this.state_!=RESETTING)throw Error("Cannot add paths once started.");var b=getPath(b);if(this.observed_.push(a,b),this.reportChangesOnOpen_){var c=this.observed_.length/2-1;this.value_[c]=b.getValueFrom(a)}},addObserver:function(a){if(this.state_!=UNOPENED&&this.state_!=RESETTING)throw Error("Cannot add observers once started.");if(this.observed_.push(observerSentinel,a),this.reportChangesOnOpen_){var b=this.observed_.length/2-1;this.value_[b]=a.open(this.deliver,this)}},startReset:function(){if(this.state_!=OPENED)throw Error("Can only reset while open");this.state_=RESETTING,this.disconnect_()},finishReset:function(){if(this.state_!=RESETTING)throw Error("Can only finishReset after startReset");return this.state_=OPENED,this.connect_(),this.value_},iterateObjects_:function(a){for(var b,c=0;c<this.observed_.length;c+=2)b=this.observed_[c],b!==observerSentinel&&this.observed_[c+1].iterateObjects(b,a)},check_:function(a,b){for(var c,d=0;d<this.observed_.length;d+=2){var e,f=this.observed_[d],g=this.observed_[d+1];if(f===observerSentinel){var h=g;e=this.state_===UNOPENED?h.open(this.deliver,this):h.discardChanges()}else e=g.getValueFrom(f);b?this.value_[d/2]=e:areSameValue(e,this.value_[d/2])||(c=c||[],c[d/2]=this.value_[d/2],this.value_[d/2]=e)}return c?(this.report_([this.value_,c,this.observed_]),!0):!1}}),ObserverTransform.prototype={open:function(a,b){return this.callback_=a,this.target_=b,this.value_=this.getValueFn_(this.observable_.open(this.observedCallback_,this)),this.value_},observedCallback_:function(a){if(a=this.getValueFn_(a),!areSameValue(a,this.value_)){var b=this.value_;this.value_=a,this.callback_.call(this.target_,this.value_,b)}},discardChanges:function(){return this.value_=this.getValueFn_(this.observable_.discardChanges()),this.value_},deliver:function(){return this.observable_.deliver()},setValue:function(a){return a=this.setValueFn_(a),!this.dontPassThroughSet_&&this.observable_.setValue?this.observable_.setValue(a):void 0},close:function(){this.observable_&&this.observable_.close(),this.callback_=void 0,this.target_=void 0,this.observable_=void 0,this.value_=void 0,this.getValueFn_=void 0,this.setValueFn_=void 0}};var expectedRecordTypes={add:!0,update:!0,"delete":!0},updateRecord={object:void 0,type:"update",name:void 0,oldValue:void 0};Observer.createBindablePrototypeAccessor=function(a,b){var c=b+"_",d=b+"Observable_";a[c]=a[b],Object.defineProperty(a,b,{get:function(){var a=this[d];return a&&a.deliver(),this[c]},set:function(a){var e=this[d];if(e)return void e.setValue(a);var f=this[c];return this[c]=a,notify(this,b,a,f),a},configurable:!0})},Observer.bindToInstance=function(a,b,c,d){var e=b+"_",f=b+"Observable_";a[f]=c;var g=a[e],h=c.open(function(c,d){a[e]=c,notify(a,b,c,d)});if(d&&!areSameValue(g,h)){var i=d(g,h);areSameValue(h,i)||(h=i,c.setValue&&c.setValue(h))}return a[e]=h,notify(a,b,h,g),{close:function(){c.close(),a[f]=void 0}}};var EDIT_LEAVE=0,EDIT_UPDATE=1,EDIT_ADD=2,EDIT_DELETE=3;ArraySplice.prototype={calcEditDistances:function(a,b,c,d,e,f){for(var g=f-e+1,h=c-b+1,i=new Array(g),j=0;g>j;j++)i[j]=new Array(h),i[j][0]=j;for(var k=0;h>k;k++)i[0][k]=k;for(var j=1;g>j;j++)for(var k=1;h>k;k++)if(this.equals(a[b+k-1],d[e+j-1]))i[j][k]=i[j-1][k-1];else{var l=i[j-1][k]+1,m=i[j][k-1]+1;i[j][k]=m>l?l:m}return i},spliceOperationsFromEditDistances:function(a){for(var b=a.length-1,c=a[0].length-1,d=a[b][c],e=[];b>0||c>0;)if(0!=b)if(0!=c){var f,g=a[b-1][c-1],h=a[b-1][c],i=a[b][c-1];f=i>h?g>h?h:g:g>i?i:g,f==g?(g==d?e.push(EDIT_LEAVE):(e.push(EDIT_UPDATE),d=g),b--,c--):f==h?(e.push(EDIT_DELETE),b--,d=h):(e.push(EDIT_ADD),c--,d=i)}else e.push(EDIT_DELETE),b--;else e.push(EDIT_ADD),c--;return e.reverse(),e},calcSplices:function(a,b,c,d,e,f){var g=0,h=0,i=Math.min(c-b,f-e);if(0==b&&0==e&&(g=this.sharedPrefix(a,d,i)),c==a.length&&f==d.length&&(h=this.sharedSuffix(a,d,i-g)),b+=g,e+=g,c-=h,f-=h,c-b==0&&f-e==0)return[];if(b==c){for(var j=newSplice(b,[],0);f>e;)j.removed.push(d[e++]);return[j]}if(e==f)return[newSplice(b,[],c-b)];for(var k=this.spliceOperationsFromEditDistances(this.calcEditDistances(a,b,c,d,e,f)),j=void 0,l=[],m=b,n=e,o=0;o<k.length;o++)switch(k[o]){case EDIT_LEAVE:j&&(l.push(j),j=void 0),m++,n++;break;case EDIT_UPDATE:j||(j=newSplice(m,[],0)),j.addedCount++,m++,j.removed.push(d[n]),n++;break;case EDIT_ADD:j||(j=newSplice(m,[],0)),j.addedCount++,m++;break;case EDIT_DELETE:j||(j=newSplice(m,[],0)),j.removed.push(d[n]),n++}return j&&l.push(j),l},sharedPrefix:function(a,b,c){for(var d=0;c>d;d++)if(!this.equals(a[d],b[d]))return d;return c},sharedSuffix:function(a,b,c){for(var d=a.length,e=b.length,f=0;c>f&&this.equals(a[--d],b[--e]);)f++;return f},calculateSplices:function(a,b){return this.calcSplices(a,0,a.length,b,0,b.length)},equals:function(a,b){return a===b}};var arraySplice=new ArraySplice;global.Observer=Observer,global.Observer.runEOM_=runEOM,global.Observer.observerSentinel_=observerSentinel,global.Observer.hasObjectObserve=hasObserve,global.ArrayObserver=ArrayObserver,global.ArrayObserver.calculateSplices=function(a,b){return arraySplice.calculateSplices(a,b)},global.ArraySplice=ArraySplice,global.ObjectObserver=ObjectObserver,global.PathObserver=PathObserver,global.CompoundObserver=CompoundObserver,global.Path=Path,global.ObserverTransform=ObserverTransform}("undefined"!=typeof global&&global&&"undefined"!=typeof module&&module?global:this||window),Platform.flags.shadow?(window.ShadowDOMPolyfill={},function(a){"use strict";function b(a){if(!a)throw new Error("Assertion failed")}function c(a,b){for(var c=M(b),d=0;d<c.length;d++){var e=c[d];L(a,e,N(b,e))}return a}function d(a,b){for(var c=M(b),d=0;d<c.length;d++){var e=c[d];switch(e){case"arguments":case"caller":case"length":case"name":case"prototype":case"toString":continue}L(a,e,N(b,e))}return a}function e(a,b){for(var c=0;c<b.length;c++)if(b[c]in a)return b[c]}function f(a,b,c){O.value=c,L(a,b,O)}function g(a){var b=a.__proto__||Object.getPrototypeOf(a),c=F.get(b);if(c)return c;var d=g(b),e=u(d);return r(b,e,a),e}function h(a,b){p(a,b,!0)}function i(a,b){p(b,a,!1)}function j(a){return/^on[a-z]+$/.test(a)}function k(a){return/^\w[a-zA-Z_0-9]*$/.test(a)}function l(a){return I&&k(a)?new Function("return this.impl."+a):function(){return this.impl[a]}}function m(a){return I&&k(a)?new Function("v","this.impl."+a+" = v"):function(b){this.impl[a]=b}}function n(a){return I&&k(a)?new Function("return this.impl."+a+".apply(this.impl, arguments)"):function(){return this.impl[a].apply(this.impl,arguments)}}function o(a,b){try{return Object.getOwnPropertyDescriptor(a,b)}catch(c){return Q}}function p(b,c,d){for(var e=M(b),f=0;f<e.length;f++){var g=e[f];if("polymerBlackList_"!==g&&!(g in c||b.polymerBlackList_&&b.polymerBlackList_[g])){P&&b.__lookupGetter__(g);var h,i,k=o(b,g);if(d&&"function"==typeof k.value)c[g]=n(g);else{var p=j(g);h=p?a.getEventHandlerGetter(g):l(g),(k.writable||k.set)&&(i=p?a.getEventHandlerSetter(g):m(g)),L(c,g,{get:h,set:i,configurable:k.configurable,enumerable:k.enumerable})}}}}function q(a,b,c){var e=a.prototype;r(e,b,c),d(b,a)}function r(a,c,d){var e=c.prototype;b(void 0===F.get(a)),F.set(a,c),G.set(e,a),h(a,e),d&&i(e,d),f(e,"constructor",c),c.prototype=e}function s(a,b){return F.get(b.prototype)===a}function t(a){var b=Object.getPrototypeOf(a),c=g(b),d=u(c);return r(b,d,a),d}function u(a){function b(b){a.call(this,b)}var c=Object.create(a.prototype);return c.constructor=b,b.prototype=c,b}function v(a){return a instanceof H.EventTarget||a instanceof H.Event||a instanceof H.Range||a instanceof H.DOMImplementation||a instanceof H.CanvasRenderingContext2D||H.WebGLRenderingContext&&a instanceof H.WebGLRenderingContext}function w(a){return S&&a instanceof S||a instanceof U||a instanceof T||a instanceof V||a instanceof W||a instanceof R||a instanceof X||Y&&a instanceof Y||Z&&a instanceof Z}function x(a){return null===a?null:(b(w(a)),a.polymerWrapper_||(a.polymerWrapper_=new(g(a))(a)))}function y(a){return null===a?null:(b(v(a)),a.impl)}function z(a){return a&&v(a)?y(a):a}function A(a){return a&&!v(a)?x(a):a}function B(a,c){null!==c&&(b(w(a)),b(void 0===c||v(c)),a.polymerWrapper_=c)}function C(a,b,c){$.get=c,L(a.prototype,b,$)}function D(a,b){C(a,b,function(){return x(this.impl[b])})}function E(a,b){a.forEach(function(a){b.forEach(function(b){a.prototype[b]=function(){var a=A(this);return a[b].apply(a,arguments)}})})}var F=new WeakMap,G=new WeakMap,H=Object.create(null),I=!("securityPolicy"in document)||document.securityPolicy.allowsEval;if("undefined"!=typeof chrome&&chrome.app&&chrome.app.runtime&&(I=!1),I)try{var J=new Function("","return true;");I=J()}catch(K){I=!1}var L=Object.defineProperty,M=Object.getOwnPropertyNames,N=Object.getOwnPropertyDescriptor,O={value:void 0,configurable:!0,enumerable:!1,writable:!0};M(window);var P=/Firefox/.test(navigator.userAgent),Q={get:function(){},set:function(){},configurable:!0,enumerable:!0},R=window.DOMImplementation,S=window.EventTarget,T=window.Event,U=window.Node,V=window.Window,W=window.Range,X=window.CanvasRenderingContext2D,Y=window.WebGLRenderingContext,Z=window.SVGElementInstance,$={get:void 0,configurable:!0,enumerable:!0};a.assert=b,a.constructorTable=F,a.defineGetter=C,a.defineWrapGetter=D,a.forwardMethodsToWrapper=E,a.isWrapper=v,a.isWrapperFor=s,a.mixin=c,a.nativePrototypeTable=G,a.oneOf=e,a.registerObject=t,a.registerWrapper=q,a.rewrap=B,a.unwrap=y,a.unwrapIfNeeded=z,a.wrap=x,a.wrapIfNeeded=A,a.wrappers=H}(window.ShadowDOMPolyfill),function(a){"use strict";function b(){g=!1;var a=f.slice(0);f=[];for(var b=0;b<a.length;b++)a[b]()}function c(a){f.push(a),g||(g=!0,d(b,0))}var d,e=window.MutationObserver,f=[],g=!1;if(e){var h=1,i=new e(b),j=document.createTextNode(h);i.observe(j,{characterData:!0}),d=function(){h=(h+1)%2,j.data=h}}else d=window.setImmediate||window.setTimeout;a.setEndOfMicrotask=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(){p||(k(c),p=!0)}function c(){p=!1;do for(var a=o.slice(),b=!1,c=0;c<a.length;c++){var d=a[c],e=d.takeRecords();f(d),e.length&&(d.callback_(e,d),b=!0)}while(b)}function d(a,b){this.type=a,this.target=b,this.addedNodes=new m.NodeList,this.removedNodes=new m.NodeList,this.previousSibling=null,this.nextSibling=null,this.attributeName=null,this.attributeNamespace=null,this.oldValue=null}function e(a,b){for(;a;a=a.parentNode){var c=n.get(a);if(c)for(var d=0;d<c.length;d++){var e=c[d];e.options.subtree&&e.addTransientObserver(b)}}}function f(a){for(var b=0;b<a.nodes_.length;b++){var c=a.nodes_[b],d=n.get(c);if(!d)return;for(var e=0;e<d.length;e++){var f=d[e];f.observer===a&&f.removeTransientObservers()}}}function g(a,c,e){for(var f=Object.create(null),g=Object.create(null),h=a;h;h=h.parentNode){var i=n.get(h);if(i)for(var j=0;j<i.length;j++){var k=i[j],l=k.options;if((h===a||l.subtree)&&!("attributes"===c&&!l.attributes||"attributes"===c&&l.attributeFilter&&(null!==e.namespace||-1===l.attributeFilter.indexOf(e.name))||"characterData"===c&&!l.characterData||"childList"===c&&!l.childList)){var m=k.observer;f[m.uid_]=m,("attributes"===c&&l.attributeOldValue||"characterData"===c&&l.characterDataOldValue)&&(g[m.uid_]=e.oldValue)}}}var o=!1;for(var p in f){var m=f[p],q=new d(c,a);"name"in e&&"namespace"in e&&(q.attributeName=e.name,q.attributeNamespace=e.namespace),e.addedNodes&&(q.addedNodes=e.addedNodes),e.removedNodes&&(q.removedNodes=e.removedNodes),e.previousSibling&&(q.previousSibling=e.previousSibling),e.nextSibling&&(q.nextSibling=e.nextSibling),void 0!==g[p]&&(q.oldValue=g[p]),m.records_.push(q),o=!0}o&&b()}function h(a){if(this.childList=!!a.childList,this.subtree=!!a.subtree,this.attributes="attributes"in a||!("attributeOldValue"in a||"attributeFilter"in a)?!!a.attributes:!0,this.characterData="characterDataOldValue"in a&&!("characterData"in a)?!0:!!a.characterData,!this.attributes&&(a.attributeOldValue||"attributeFilter"in a)||!this.characterData&&a.characterDataOldValue)throw new TypeError;if(this.characterData=!!a.characterData,this.attributeOldValue=!!a.attributeOldValue,this.characterDataOldValue=!!a.characterDataOldValue,"attributeFilter"in a){if(null==a.attributeFilter||"object"!=typeof a.attributeFilter)throw new TypeError;this.attributeFilter=q.call(a.attributeFilter)}else this.attributeFilter=null}function i(a){this.callback_=a,this.nodes_=[],this.records_=[],this.uid_=++r,o.push(this)}function j(a,b,c){this.observer=a,this.target=b,this.options=c,this.transientObservedNodes=[]}var k=a.setEndOfMicrotask,l=a.wrapIfNeeded,m=a.wrappers,n=new WeakMap,o=[],p=!1,q=Array.prototype.slice,r=0;i.prototype={observe:function(a,b){a=l(a);var c,d=new h(b),e=n.get(a);e||n.set(a,e=[]);for(var f=0;f<e.length;f++)e[f].observer===this&&(c=e[f],c.removeTransientObservers(),c.options=d);c||(c=new j(this,a,d),e.push(c),this.nodes_.push(a))},disconnect:function(){this.nodes_.forEach(function(a){for(var b=n.get(a),c=0;c<b.length;c++){var d=b[c];if(d.observer===this){b.splice(c,1);break}}},this),this.records_=[]},takeRecords:function(){var a=this.records_;return this.records_=[],a}},j.prototype={addTransientObserver:function(a){if(a!==this.target){this.transientObservedNodes.push(a);var b=n.get(a);b||n.set(a,b=[]),b.push(this)}},removeTransientObservers:function(){var a=this.transientObservedNodes;this.transientObservedNodes=[];for(var b=0;b<a.length;b++)for(var c=a[b],d=n.get(c),e=0;e<d.length;e++)if(d[e]===this){d.splice(e,1);break}}},a.enqueueMutation=g,a.registerTransientObservers=e,a.wrappers.MutationObserver=i,a.wrappers.MutationRecord=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a,b){this.root=a,this.parent=b}function c(a,b){if(a.treeScope_!==b){a.treeScope_=b;for(var d=a.shadowRoot;d;d=d.olderShadowRoot)d.treeScope_.parent=b;for(var e=a.firstChild;e;e=e.nextSibling)c(e,b)}}function d(a){if(a.treeScope_)return a.treeScope_;var c,e=a.parentNode;return c=e?d(e):new b(a,null),a.treeScope_=c}b.prototype={get renderer(){return this.root instanceof a.wrappers.ShadowRoot?a.getRendererForHost(this.root.host):null},contains:function(a){for(;a;a=a.parent)if(a===this)return!0;return!1}},a.TreeScope=b,a.getTreeScope=d,a.setTreeScope=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){return a instanceof R.ShadowRoot}function c(a){var b=a.localName;return"content"===b||"shadow"===b}function d(a){return!!a.shadowRoot}function e(a){var b;return a.parentNode||(b=a.defaultView)&&Q(b)||null}function f(f,g,h){if(h.length)return h.shift();if(b(f))return j(f)||f.host;var i=a.eventParentsTable.get(f);if(i){for(var k=1;k<i.length;k++)h[k-1]=i[k];return i[0]}if(g&&c(f)){var l=f.parentNode;if(l&&d(l))for(var m=a.getShadowTrees(l),n=j(g),k=0;k<m.length;k++)if(m[k].contains(n))return n}return e(f)}function g(a){for(var d=[],e=a,g=[],i=[];e;){var j=null;if(c(e)){j=h(d);var k=d[d.length-1]||e;d.push(k)}else d.length||d.push(e);var l=d[d.length-1];g.push({target:l,currentTarget:e}),b(e)&&d.pop(),e=f(e,j,i)}return g}function h(a){for(var b=a.length-1;b>=0;b--)if(!c(a[b]))return a[b];return null}function i(a,d){for(var e=[];a;){for(var g=[],i=d,j=void 0;i;){var m=null;if(g.length){if(c(i)&&(m=h(g),k(j))){var n=g[g.length-1];g.push(n)}}else g.push(i);if(l(i,a))return g[g.length-1];b(i)&&g.pop(),j=i,i=f(i,m,e)}a=b(a)?a.host:a.parentNode}}function j(b){return a.insertionParentTable.get(b)}function k(a){return j(a)}function l(a,b){return M(a)===M(b)}function m(a){if(!T.get(a)&&(T.set(a,!0),o(Q(a),Q(a.target)),K)){var b=K;throw K=null,b}}function n(a){switch(a.type){case"beforeunload":case"load":case"unload":return!0}return!1}function o(b,c){if(U.get(b))throw new Error("InvalidStateError");U.set(b,!0),a.renderAllPending();var d=g(c);return 2===d.length&&d[0].target instanceof R.Document&&n(b)&&d.shift(),ab.set(b,d),p(b,d)&&q(b,d)&&r(b,d),Y.set(b,u.NONE),W.delete(b,null),U.delete(b),b.defaultPrevented}function p(a,b){for(var c,d=b.length-1;d>0;d--){var e=b[d].target,f=b[d].currentTarget;if(e!==f&&(c=u.CAPTURING_PHASE,!s(b[d],a,c)))return!1}return!0}function q(a,b){var c=u.AT_TARGET;return s(b[0],a,c)}function r(a,b){for(var c,d=a.bubbles,e=1;e<b.length;e++){var f=b[e].target,g=b[e].currentTarget;if(f===g)c=u.AT_TARGET;else{if(!d||$.get(a))continue;c=u.BUBBLING_PHASE}if(!s(b[e],a,c))return}}function s(a,b,c){var d=a.target,e=a.currentTarget,f=S.get(e);if(!f)return!0;if("relatedTarget"in b){var g=P(b),h=g.relatedTarget;if(h){if(h instanceof Object&&h.addEventListener){var j=Q(h),k=i(e,j);if(k===d)return!0}else k=null;X.set(b,k)}}Y.set(b,c);var l=b.type,m=!1;V.set(b,d),W.set(b,e);for(var n=0;n<f.length;n++){var o=f[n];if(o.removed)m=!0;else if(!(o.type!==l||!o.capture&&c===u.CAPTURING_PHASE||o.capture&&c===u.BUBBLING_PHASE))try{if("function"==typeof o.handler?o.handler.call(e,b):o.handler.handleEvent(b),$.get(b))return!1
+}catch(p){K||(K=p)}}if(m){var q=f.slice();f.length=0;for(var n=0;n<q.length;n++)q[n].removed||f.push(q[n])}return!Z.get(b)}function t(a,b,c){this.type=a,this.handler=b,this.capture=Boolean(c)}function u(a,b){if(!(a instanceof bb))return Q(y(bb,"Event",a,b));var c=a;return mb||"beforeunload"!==c.type?void(this.impl=c):new z(c)}function v(a){return a&&a.relatedTarget?Object.create(a,{relatedTarget:{value:P(a.relatedTarget)}}):a}function w(a,b,c){var d=window[a],e=function(b,c){return b instanceof d?void(this.impl=b):Q(y(d,a,b,c))};if(e.prototype=Object.create(b.prototype),c&&N(e.prototype,c),d)try{O(d,e,new d("temp"))}catch(f){O(d,e,document.createEvent(a))}return e}function x(a,b){return function(){arguments[b]=P(arguments[b]);var c=P(this);c[a].apply(c,arguments)}}function y(a,b,c,d){if(kb)return new a(c,v(d));var e=P(document.createEvent(b)),f=jb[b],g=[c];return Object.keys(f).forEach(function(a){var b=null!=d&&a in d?d[a]:f[a];"relatedTarget"===a&&(b=P(b)),g.push(b)}),e["init"+b].apply(e,g),e}function z(a){u.call(this,a)}function A(a){return"function"==typeof a?!0:a&&a.handleEvent}function B(a){switch(a){case"DOMAttrModified":case"DOMAttributeNameChanged":case"DOMCharacterDataModified":case"DOMElementNameChanged":case"DOMNodeInserted":case"DOMNodeInsertedIntoDocument":case"DOMNodeRemoved":case"DOMNodeRemovedFromDocument":case"DOMSubtreeModified":return!0}return!1}function C(a){this.impl=a}function D(a){return a instanceof R.ShadowRoot&&(a=a.host),P(a)}function E(a,b){var c=S.get(a);if(c)for(var d=0;d<c.length;d++)if(!c[d].removed&&c[d].type===b)return!0;return!1}function F(a,b){for(var c=P(a);c;c=c.parentNode)if(E(Q(c),b))return!0;return!1}function G(a){L(a,ob)}function H(b,c,d,e){a.renderAllPending();for(var f=Q(pb.call(c.impl,d,e)),h=g(f,this),i=0;i<h.length;i++){var j=h[i];if(j.currentTarget===b)return j.target}return null}function I(a){return function(){var b=_.get(this);return b&&b[a]&&b[a].value||null}}function J(a){var b=a.slice(2);return function(c){var d=_.get(this);d||(d=Object.create(null),_.set(this,d));var e=d[a];if(e&&this.removeEventListener(b,e.wrapped,!1),"function"==typeof c){var f=function(b){var d=c.call(this,b);d===!1?b.preventDefault():"onbeforeunload"===a&&"string"==typeof d&&(b.returnValue=d)};this.addEventListener(b,f,!1),d[a]={value:c,wrapped:f}}}}var K,L=a.forwardMethodsToWrapper,M=a.getTreeScope,N=a.mixin,O=a.registerWrapper,P=a.unwrap,Q=a.wrap,R=a.wrappers,S=(new WeakMap,new WeakMap),T=new WeakMap,U=new WeakMap,V=new WeakMap,W=new WeakMap,X=new WeakMap,Y=new WeakMap,Z=new WeakMap,$=new WeakMap,_=new WeakMap,ab=new WeakMap;t.prototype={equals:function(a){return this.handler===a.handler&&this.type===a.type&&this.capture===a.capture},get removed(){return null===this.handler},remove:function(){this.handler=null}};var bb=window.Event;bb.prototype.polymerBlackList_={returnValue:!0,keyLocation:!0},u.prototype={get target(){return V.get(this)},get currentTarget(){return W.get(this)},get eventPhase(){return Y.get(this)},get path(){var a=new R.NodeList,b=ab.get(this);if(b){for(var c=0,d=b.length-1,e=M(W.get(this)),f=0;d>=f;f++){var g=b[f].currentTarget,h=M(g);h.contains(e)&&(f!==d||g instanceof R.Node)&&(a[c++]=g)}a.length=c}return a},stopPropagation:function(){Z.set(this,!0)},stopImmediatePropagation:function(){Z.set(this,!0),$.set(this,!0)}},O(bb,u,document.createEvent("Event"));var cb=w("UIEvent",u),db=w("CustomEvent",u),eb={get relatedTarget(){var a=X.get(this);return void 0!==a?a:Q(P(this).relatedTarget)}},fb=N({initMouseEvent:x("initMouseEvent",14)},eb),gb=N({initFocusEvent:x("initFocusEvent",5)},eb),hb=w("MouseEvent",cb,fb),ib=w("FocusEvent",cb,gb),jb=Object.create(null),kb=function(){try{new window.FocusEvent("focus")}catch(a){return!1}return!0}();if(!kb){var lb=function(a,b,c){if(c){var d=jb[c];b=N(N({},d),b)}jb[a]=b};lb("Event",{bubbles:!1,cancelable:!1}),lb("CustomEvent",{detail:null},"Event"),lb("UIEvent",{view:null,detail:0},"Event"),lb("MouseEvent",{screenX:0,screenY:0,clientX:0,clientY:0,ctrlKey:!1,altKey:!1,shiftKey:!1,metaKey:!1,button:0,relatedTarget:null},"UIEvent"),lb("FocusEvent",{relatedTarget:null},"UIEvent")}var mb=window.BeforeUnloadEvent;z.prototype=Object.create(u.prototype),N(z.prototype,{get returnValue(){return this.impl.returnValue},set returnValue(a){this.impl.returnValue=a}}),mb&&O(mb,z);var nb=window.EventTarget,ob=["addEventListener","removeEventListener","dispatchEvent"];[Node,Window].forEach(function(a){var b=a.prototype;ob.forEach(function(a){Object.defineProperty(b,a+"_",{value:b[a]})})}),C.prototype={addEventListener:function(a,b,c){if(A(b)&&!B(a)){var d=new t(a,b,c),e=S.get(this);if(e){for(var f=0;f<e.length;f++)if(d.equals(e[f]))return}else e=[],S.set(this,e);e.push(d);var g=D(this);g.addEventListener_(a,m,!0)}},removeEventListener:function(a,b,c){c=Boolean(c);var d=S.get(this);if(d){for(var e=0,f=!1,g=0;g<d.length;g++)d[g].type===a&&d[g].capture===c&&(e++,d[g].handler===b&&(f=!0,d[g].remove()));if(f&&1===e){var h=D(this);h.removeEventListener_(a,m,!0)}}},dispatchEvent:function(b){var c=P(b),d=c.type;T.set(c,!1),a.renderAllPending();var e;F(this,d)||(e=function(){},this.addEventListener(d,e,!0));try{return P(this).dispatchEvent_(c)}finally{e&&this.removeEventListener(d,e,!0)}}},nb&&O(nb,C);var pb=document.elementFromPoint;a.adjustRelatedTarget=i,a.elementFromPoint=H,a.getEventHandlerGetter=I,a.getEventHandlerSetter=J,a.wrapEventTargetMethods=G,a.wrappers.BeforeUnloadEvent=z,a.wrappers.CustomEvent=db,a.wrappers.Event=u,a.wrappers.EventTarget=C,a.wrappers.FocusEvent=ib,a.wrappers.MouseEvent=hb,a.wrappers.UIEvent=cb}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a,b){Object.defineProperty(a,b,g)}function c(){this.length=0,b(this,"length")}function d(a){if(null==a)return a;for(var b=new c,d=0,e=a.length;e>d;d++)b[d]=f(a[d]);return b.length=e,b}function e(a,b){a.prototype[b]=function(){return d(this.impl[b].apply(this.impl,arguments))}}var f=a.wrap,g={enumerable:!1};c.prototype={item:function(a){return this[a]}},b(c.prototype,"item"),a.wrappers.NodeList=c,a.addWrapNodeListMethod=e,a.wrapNodeList=d}(window.ShadowDOMPolyfill),function(a){"use strict";a.wrapHTMLCollection=a.wrapNodeList,a.wrappers.HTMLCollection=a.wrappers.NodeList}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){A(a instanceof w)}function c(a){var b=new y;return b[0]=a,b.length=1,b}function d(a,b,c){C(b,"childList",{removedNodes:c,previousSibling:a.previousSibling,nextSibling:a.nextSibling})}function e(a,b){C(a,"childList",{removedNodes:b})}function f(a,b,d,e){if(a instanceof DocumentFragment){var f=h(a);O=!0;for(var g=f.length-1;g>=0;g--)a.removeChild(f[g]),f[g].parentNode_=b;O=!1;for(var g=0;g<f.length;g++)f[g].previousSibling_=f[g-1]||d,f[g].nextSibling_=f[g+1]||e;return d&&(d.nextSibling_=f[0]),e&&(e.previousSibling_=f[f.length-1]),f}var f=c(a),i=a.parentNode;return i&&i.removeChild(a),a.parentNode_=b,a.previousSibling_=d,a.nextSibling_=e,d&&(d.nextSibling_=a),e&&(e.previousSibling_=a),f}function g(a){if(a instanceof DocumentFragment)return h(a);var b=c(a),e=a.parentNode;return e&&d(a,e,b),b}function h(a){for(var b=new y,c=0,d=a.firstChild;d;d=d.nextSibling)b[c++]=d;return b.length=c,e(a,b),b}function i(a){return a}function j(a,b){I(a,b),a.nodeIsInserted_()}function k(a,b){for(var c=D(b),d=0;d<a.length;d++)j(a[d],c)}function l(a){I(a,new z(a,null))}function m(a){for(var b=0;b<a.length;b++)l(a[b])}function n(a,b){var c=a.nodeType===w.DOCUMENT_NODE?a:a.ownerDocument;c!==b.ownerDocument&&c.adoptNode(b)}function o(b,c){if(c.length){var d=b.ownerDocument;if(d!==c[0].ownerDocument)for(var e=0;e<c.length;e++)a.adoptNodeNoRemove(c[e],d)}}function p(a,b){o(a,b);var c=b.length;if(1===c)return J(b[0]);for(var d=J(a.ownerDocument.createDocumentFragment()),e=0;c>e;e++)d.appendChild(J(b[e]));return d}function q(a){if(void 0!==a.firstChild_)for(var b=a.firstChild_;b;){var c=b;b=b.nextSibling_,c.parentNode_=c.previousSibling_=c.nextSibling_=void 0}a.firstChild_=a.lastChild_=void 0}function r(a){if(a.invalidateShadowRenderer()){for(var b=a.firstChild;b;){A(b.parentNode===a);var c=b.nextSibling,d=J(b),e=d.parentNode;e&&V.call(e,d),b.previousSibling_=b.nextSibling_=b.parentNode_=null,b=c}a.firstChild_=a.lastChild_=null}else for(var c,f=J(a),g=f.firstChild;g;)c=g.nextSibling,V.call(f,g),g=c}function s(a){var b=a.parentNode;return b&&b.invalidateShadowRenderer()}function t(a){for(var b,c=0;c<a.length;c++)b=a[c],b.parentNode.removeChild(b)}function u(a,b,c){var d;if(d=L(c?P.call(c,a.impl,!1):Q.call(a.impl,!1)),b){for(var e=a.firstChild;e;e=e.nextSibling)d.appendChild(u(e,!0,c));if(a instanceof N.HTMLTemplateElement)for(var f=d.content,e=a.content.firstChild;e;e=e.nextSibling)f.appendChild(u(e,!0,c))}return d}function v(a,b){if(!b||D(a)!==D(b))return!1;for(var c=b;c;c=c.parentNode)if(c===a)return!0;return!1}function w(a){A(a instanceof R),x.call(this,a),this.parentNode_=void 0,this.firstChild_=void 0,this.lastChild_=void 0,this.nextSibling_=void 0,this.previousSibling_=void 0,this.treeScope_=void 0}var x=a.wrappers.EventTarget,y=a.wrappers.NodeList,z=a.TreeScope,A=a.assert,B=a.defineWrapGetter,C=a.enqueueMutation,D=a.getTreeScope,E=a.isWrapper,F=a.mixin,G=a.registerTransientObservers,H=a.registerWrapper,I=a.setTreeScope,J=a.unwrap,K=a.unwrapIfNeeded,L=a.wrap,M=a.wrapIfNeeded,N=a.wrappers,O=!1,P=document.importNode,Q=window.Node.prototype.cloneNode,R=window.Node,S=window.DocumentFragment,T=(R.prototype.appendChild,R.prototype.compareDocumentPosition),U=R.prototype.insertBefore,V=R.prototype.removeChild,W=R.prototype.replaceChild,X=/Trident/.test(navigator.userAgent),Y=X?function(a,b){try{V.call(a,b)}catch(c){if(!(a instanceof S))throw c}}:function(a,b){V.call(a,b)};w.prototype=Object.create(x.prototype),F(w.prototype,{appendChild:function(a){return this.insertBefore(a,null)},insertBefore:function(a,c){b(a);var d;c?E(c)?d=J(c):(d=c,c=L(d)):(c=null,d=null),c&&A(c.parentNode===this);var e,h=c?c.previousSibling:this.lastChild,i=!this.invalidateShadowRenderer()&&!s(a);if(e=i?g(a):f(a,this,h,c),i)n(this,a),q(this),U.call(this.impl,J(a),d);else{h||(this.firstChild_=e[0]),c||(this.lastChild_=e[e.length-1]);var j=d?d.parentNode:this.impl;j?U.call(j,p(this,e),d):o(this,e)}return C(this,"childList",{addedNodes:e,nextSibling:c,previousSibling:h}),k(e,this),a},removeChild:function(a){if(b(a),a.parentNode!==this){for(var d=!1,e=(this.childNodes,this.firstChild);e;e=e.nextSibling)if(e===a){d=!0;break}if(!d)throw new Error("NotFoundError")}var f=J(a),g=a.nextSibling,h=a.previousSibling;if(this.invalidateShadowRenderer()){var i=this.firstChild,j=this.lastChild,k=f.parentNode;k&&Y(k,f),i===a&&(this.firstChild_=g),j===a&&(this.lastChild_=h),h&&(h.nextSibling_=g),g&&(g.previousSibling_=h),a.previousSibling_=a.nextSibling_=a.parentNode_=void 0}else q(this),Y(this.impl,f);return O||C(this,"childList",{removedNodes:c(a),nextSibling:g,previousSibling:h}),G(this,a),a},replaceChild:function(a,d){b(a);var e;if(E(d)?e=J(d):(e=d,d=L(e)),d.parentNode!==this)throw new Error("NotFoundError");var h,i=d.nextSibling,j=d.previousSibling,m=!this.invalidateShadowRenderer()&&!s(a);return m?h=g(a):(i===a&&(i=a.nextSibling),h=f(a,this,j,i)),m?(n(this,a),q(this),W.call(this.impl,J(a),e)):(this.firstChild===d&&(this.firstChild_=h[0]),this.lastChild===d&&(this.lastChild_=h[h.length-1]),d.previousSibling_=d.nextSibling_=d.parentNode_=void 0,e.parentNode&&W.call(e.parentNode,p(this,h),e)),C(this,"childList",{addedNodes:h,removedNodes:c(d),nextSibling:i,previousSibling:j}),l(d),k(h,this),d},nodeIsInserted_:function(){for(var a=this.firstChild;a;a=a.nextSibling)a.nodeIsInserted_()},hasChildNodes:function(){return null!==this.firstChild},get parentNode(){return void 0!==this.parentNode_?this.parentNode_:L(this.impl.parentNode)},get firstChild(){return void 0!==this.firstChild_?this.firstChild_:L(this.impl.firstChild)},get lastChild(){return void 0!==this.lastChild_?this.lastChild_:L(this.impl.lastChild)},get nextSibling(){return void 0!==this.nextSibling_?this.nextSibling_:L(this.impl.nextSibling)},get previousSibling(){return void 0!==this.previousSibling_?this.previousSibling_:L(this.impl.previousSibling)},get parentElement(){for(var a=this.parentNode;a&&a.nodeType!==w.ELEMENT_NODE;)a=a.parentNode;return a},get textContent(){for(var a="",b=this.firstChild;b;b=b.nextSibling)b.nodeType!=w.COMMENT_NODE&&(a+=b.textContent);return a},set textContent(a){var b=i(this.childNodes);if(this.invalidateShadowRenderer()){if(r(this),""!==a){var c=this.impl.ownerDocument.createTextNode(a);this.appendChild(c)}}else q(this),this.impl.textContent=a;var d=i(this.childNodes);C(this,"childList",{addedNodes:d,removedNodes:b}),m(b),k(d,this)},get childNodes(){for(var a=new y,b=0,c=this.firstChild;c;c=c.nextSibling)a[b++]=c;return a.length=b,a},cloneNode:function(a){return u(this,a)},contains:function(a){return v(this,M(a))},compareDocumentPosition:function(a){return T.call(this.impl,K(a))},normalize:function(){for(var a,b,c=i(this.childNodes),d=[],e="",f=0;f<c.length;f++)b=c[f],b.nodeType===w.TEXT_NODE?a||b.data.length?a?(e+=b.data,d.push(b)):a=b:this.removeNode(b):(a&&d.length&&(a.data+=e,cleanUpNodes(d)),d=[],e="",a=null,b.childNodes.length&&b.normalize());a&&d.length&&(a.data+=e,t(d))}}),B(w,"ownerDocument"),H(R,w,document.createDocumentFragment()),delete w.prototype.querySelector,delete w.prototype.querySelectorAll,w.prototype=F(Object.create(x.prototype),w.prototype),a.cloneNode=u,a.nodeWasAdded=j,a.nodeWasRemoved=l,a.nodesWereAdded=k,a.nodesWereRemoved=m,a.snapshotNodeList=i,a.wrappers.Node=w}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a,c){for(var d,e=a.firstElementChild;e;){if(e.matches(c))return e;if(d=b(e,c))return d;e=e.nextElementSibling}return null}function c(a,b){return a.matches(b)}function d(a,b,c){var d=a.localName;return d===b||d===c&&a.namespaceURI===l}function e(){return!0}function f(a,b){return a.localName===b}function g(a,b){return a.namespaceURI===b}function h(a,b,c){return a.namespaceURI===b&&a.localName===c}function i(a,b,c,d,e){for(var f=a.firstElementChild;f;)c(f,d,e)&&(b[b.length++]=f),i(f,b,c,d,e),f=f.nextElementSibling;return b}var j=a.wrappers.HTMLCollection,k=a.wrappers.NodeList,l="http://www.w3.org/1999/xhtml",m={querySelector:function(a){return b(this,a)},querySelectorAll:function(a){return i(this,new k,c,a)}},n={getElementsByTagName:function(a){var b=new j;return"*"===a?i(this,b,e):i(this,b,d,a,a.toLowerCase())},getElementsByClassName:function(a){return this.querySelectorAll("."+a)},getElementsByTagNameNS:function(a,b){var c=new j;if(""===a)a=null;else if("*"===a)return"*"===b?i(this,c,e):i(this,c,f,b);return"*"===b?i(this,c,g,a):i(this,c,h,a,b)}};a.GetElementsByInterface=n,a.SelectorsInterface=m}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){for(;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.nextSibling;return a}function c(a){for(;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.previousSibling;return a}var d=a.wrappers.NodeList,e={get firstElementChild(){return b(this.firstChild)},get lastElementChild(){return c(this.lastChild)},get childElementCount(){for(var a=0,b=this.firstElementChild;b;b=b.nextElementSibling)a++;return a},get children(){for(var a=new d,b=0,c=this.firstElementChild;c;c=c.nextElementSibling)a[b++]=c;return a.length=b,a},remove:function(){var a=this.parentNode;a&&a.removeChild(this)}},f={get nextElementSibling(){return b(this.nextSibling)},get previousElementSibling(){return c(this.previousSibling)}};a.ChildNodeInterface=f,a.ParentNodeInterface=e}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d.call(this,a)}var c=a.ChildNodeInterface,d=a.wrappers.Node,e=a.enqueueMutation,f=a.mixin,g=a.registerWrapper,h=window.CharacterData;b.prototype=Object.create(d.prototype),f(b.prototype,{get textContent(){return this.data},set textContent(a){this.data=a},get data(){return this.impl.data},set data(a){var b=this.impl.data;e(this,"characterData",{oldValue:b}),this.impl.data=a}}),f(b.prototype,c),g(h,b,document.createTextNode("")),a.wrappers.CharacterData=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){return a>>>0}function c(a){d.call(this,a)}var d=a.wrappers.CharacterData,e=(a.enqueueMutation,a.mixin),f=a.registerWrapper,g=window.Text;c.prototype=Object.create(d.prototype),e(c.prototype,{splitText:function(a){a=b(a);var c=this.data;if(a>c.length)throw new Error("IndexSizeError");var d=c.slice(0,a),e=c.slice(a);this.data=d;var f=this.ownerDocument.createTextNode(e);return this.parentNode&&this.parentNode.insertBefore(f,this.nextSibling),f}}),f(g,c,document.createTextNode("")),a.wrappers.Text=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(b,c){var d=b.parentNode;if(d&&d.shadowRoot){var e=a.getRendererForHost(d);e.dependsOnAttribute(c)&&e.invalidate()}}function c(a,b,c){k(a,"attributes",{name:b,namespace:null,oldValue:c})}function d(a){h.call(this,a)}function e(a,c,d){var e=d||c;Object.defineProperty(a,c,{get:function(){return this.impl[c]},set:function(a){this.impl[c]=a,b(this,e)},configurable:!0,enumerable:!0})}var f=a.ChildNodeInterface,g=a.GetElementsByInterface,h=a.wrappers.Node,i=a.ParentNodeInterface,j=a.SelectorsInterface,k=(a.addWrapNodeListMethod,a.enqueueMutation),l=a.mixin,m=(a.oneOf,a.registerWrapper),n=a.wrappers,o=window.Element,p=["matches","mozMatchesSelector","msMatchesSelector","webkitMatchesSelector"].filter(function(a){return o.prototype[a]}),q=p[0],r=o.prototype[q];d.prototype=Object.create(h.prototype),l(d.prototype,{createShadowRoot:function(){var b=new n.ShadowRoot(this);this.impl.polymerShadowRoot_=b;var c=a.getRendererForHost(this);return c.invalidate(),b},get shadowRoot(){return this.impl.polymerShadowRoot_||null},setAttribute:function(a,d){var e=this.impl.getAttribute(a);this.impl.setAttribute(a,d),c(this,a,e),b(this,a)},removeAttribute:function(a){var d=this.impl.getAttribute(a);this.impl.removeAttribute(a),c(this,a,d),b(this,a)},matches:function(a){return r.call(this.impl,a)}}),p.forEach(function(a){"matches"!==a&&(d.prototype[a]=function(a){return this.matches(a)})}),o.prototype.webkitCreateShadowRoot&&(d.prototype.webkitCreateShadowRoot=d.prototype.createShadowRoot),e(d.prototype,"id"),e(d.prototype,"className","class"),l(d.prototype,f),l(d.prototype,g),l(d.prototype,i),l(d.prototype,j),m(o,d,document.createElementNS(null,"x")),a.matchesNames=p,a.wrappers.Element=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){switch(a){case"&":return"&amp;";case"<":return"&lt;";case">":return"&gt;";case'"':return"&quot;";case" ":return"&nbsp;"}}function c(a){return a.replace(z,b)}function d(a){return a.replace(A,b)}function e(a){for(var b={},c=0;c<a.length;c++)b[a[c]]=!0;return b}function f(a,b){switch(a.nodeType){case Node.ELEMENT_NODE:for(var e,f=a.tagName.toLowerCase(),h="<"+f,i=a.attributes,j=0;e=i[j];j++)h+=" "+e.name+'="'+c(e.value)+'"';return h+=">",B[f]?h:h+g(a)+"</"+f+">";case Node.TEXT_NODE:var k=a.data;return b&&C[b.localName]?k:d(k);case Node.COMMENT_NODE:return"<!--"+a.data+"-->";default:throw console.error(a),new Error("not implemented")}}function g(a){a instanceof y.HTMLTemplateElement&&(a=a.content);for(var b="",c=a.firstChild;c;c=c.nextSibling)b+=f(c,a);return b}function h(a,b,c){var d=c||"div";a.textContent="";var e=w(a.ownerDocument.createElement(d));e.innerHTML=b;for(var f;f=e.firstChild;)a.appendChild(x(f))}function i(a){o.call(this,a)}function j(a,b){var c=w(a.cloneNode(!1));c.innerHTML=b;for(var d,e=w(document.createDocumentFragment());d=c.firstChild;)e.appendChild(d);return x(e)}function k(b){return function(){return a.renderAllPending(),this.impl[b]}}function l(a){p(i,a,k(a))}function m(b){Object.defineProperty(i.prototype,b,{get:k(b),set:function(c){a.renderAllPending(),this.impl[b]=c},configurable:!0,enumerable:!0})}function n(b){Object.defineProperty(i.prototype,b,{value:function(){return a.renderAllPending(),this.impl[b].apply(this.impl,arguments)},configurable:!0,enumerable:!0})}var o=a.wrappers.Element,p=a.defineGetter,q=a.enqueueMutation,r=a.mixin,s=a.nodesWereAdded,t=a.nodesWereRemoved,u=a.registerWrapper,v=a.snapshotNodeList,w=a.unwrap,x=a.wrap,y=a.wrappers,z=/[&\u00A0"]/g,A=/[&\u00A0<>]/g,B=e(["area","base","br","col","command","embed","hr","img","input","keygen","link","meta","param","source","track","wbr"]),C=e(["style","script","xmp","iframe","noembed","noframes","plaintext","noscript"]),D=/MSIE/.test(navigator.userAgent),E=window.HTMLElement,F=window.HTMLTemplateElement;i.prototype=Object.create(o.prototype),r(i.prototype,{get innerHTML(){return g(this)},set innerHTML(a){if(D&&C[this.localName])return void(this.textContent=a);var b=v(this.childNodes);this.invalidateShadowRenderer()?this instanceof y.HTMLTemplateElement?h(this.content,a):h(this,a,this.tagName):!F&&this instanceof y.HTMLTemplateElement?h(this.content,a):this.impl.innerHTML=a;var c=v(this.childNodes);q(this,"childList",{addedNodes:c,removedNodes:b}),t(b),s(c,this)},get outerHTML(){return f(this,this.parentNode)},set outerHTML(a){var b=this.parentNode;if(b){b.invalidateShadowRenderer();var c=j(b,a);b.replaceChild(c,this)}},insertAdjacentHTML:function(a,b){var c,d;switch(String(a).toLowerCase()){case"beforebegin":c=this.parentNode,d=this;break;case"afterend":c=this.parentNode,d=this.nextSibling;break;case"afterbegin":c=this,d=this.firstChild;break;case"beforeend":c=this,d=null;break;default:return}var e=j(c,b);c.insertBefore(e,d)}}),["clientHeight","clientLeft","clientTop","clientWidth","offsetHeight","offsetLeft","offsetTop","offsetWidth","scrollHeight","scrollWidth"].forEach(l),["scrollLeft","scrollTop"].forEach(m),["getBoundingClientRect","getClientRects","scrollIntoView"].forEach(n),u(E,i,document.createElement("b")),a.wrappers.HTMLElement=i,a.getInnerHTML=g,a.setInnerHTML=h}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.wrap,g=window.HTMLCanvasElement;b.prototype=Object.create(c.prototype),d(b.prototype,{getContext:function(){var a=this.impl.getContext.apply(this.impl,arguments);return a&&f(a)}}),e(g,b,document.createElement("canvas")),a.wrappers.HTMLCanvasElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=window.HTMLContentElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get select(){return this.getAttribute("select")},set select(a){this.setAttribute("select",a)},setAttribute:function(a,b){c.prototype.setAttribute.call(this,a,b),"select"===String(a).toLowerCase()&&this.invalidateShadowRenderer(!0)}}),f&&e(f,b),a.wrappers.HTMLContentElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d.call(this,a)}function c(a,b){if(!(this instanceof c))throw new TypeError("DOM object constructor cannot be called as a function.");var e=f(document.createElement("img"));d.call(this,e),g(e,this),void 0!==a&&(e.width=a),void 0!==b&&(e.height=b)}var d=a.wrappers.HTMLElement,e=a.registerWrapper,f=a.unwrap,g=a.rewrap,h=window.HTMLImageElement;b.prototype=Object.create(d.prototype),e(h,b,document.createElement("img")),c.prototype=b.prototype,a.wrappers.HTMLImageElement=b,a.wrappers.Image=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=window.HTMLShadowElement;b.prototype=Object.create(c.prototype),d(b.prototype,{}),f&&e(f,b),a.wrappers.HTMLShadowElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){if(!a.defaultView)return a;var b=k.get(a);if(!b){for(b=a.implementation.createHTMLDocument("");b.lastChild;)b.removeChild(b.lastChild);k.set(a,b)}return b}function c(a){for(var c,d=b(a.ownerDocument),e=h(d.createDocumentFragment());c=a.firstChild;)e.appendChild(c);return e}function d(a){if(e.call(this,a),!l){var b=c(a);j.set(this,i(b))}}var e=a.wrappers.HTMLElement,f=a.mixin,g=a.registerWrapper,h=a.unwrap,i=a.wrap,j=new WeakMap,k=new WeakMap,l=window.HTMLTemplateElement;d.prototype=Object.create(e.prototype),f(d.prototype,{get content(){return l?i(this.impl.content):j.get(this)}}),l&&g(l,d),a.wrappers.HTMLTemplateElement=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.registerWrapper,e=window.HTMLMediaElement;b.prototype=Object.create(c.prototype),d(e,b,document.createElement("audio")),a.wrappers.HTMLMediaElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d.call(this,a)}function c(a){if(!(this instanceof c))throw new TypeError("DOM object constructor cannot be called as a function.");var b=f(document.createElement("audio"));d.call(this,b),g(b,this),b.setAttribute("preload","auto"),void 0!==a&&b.setAttribute("src",a)}var d=a.wrappers.HTMLMediaElement,e=a.registerWrapper,f=a.unwrap,g=a.rewrap,h=window.HTMLAudioElement;b.prototype=Object.create(d.prototype),e(h,b,document.createElement("audio")),c.prototype=b.prototype,a.wrappers.HTMLAudioElement=b,a.wrappers.Audio=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){return a.replace(/\s+/g," ").trim()}function c(a){e.call(this,a)}function d(a,b,c,f){if(!(this instanceof d))throw new TypeError("DOM object constructor cannot be called as a function.");var g=i(document.createElement("option"));e.call(this,g),h(g,this),void 0!==a&&(g.text=a),void 0!==b&&g.setAttribute("value",b),c===!0&&g.setAttribute("selected",""),g.selected=f===!0}var e=a.wrappers.HTMLElement,f=a.mixin,g=a.registerWrapper,h=a.rewrap,i=a.unwrap,j=a.wrap,k=window.HTMLOptionElement;c.prototype=Object.create(e.prototype),f(c.prototype,{get text(){return b(this.textContent)},set text(a){this.textContent=b(String(a))},get form(){return j(i(this).form)}}),g(k,c,document.createElement("option")),d.prototype=c.prototype,a.wrappers.HTMLOptionElement=c,a.wrappers.Option=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.unwrap,g=a.wrap,h=window.HTMLSelectElement;b.prototype=Object.create(c.prototype),d(b.prototype,{add:function(a,b){"object"==typeof b&&(b=f(b)),f(this).add(f(a),b)},remove:function(a){return void 0===a?void c.prototype.remove.call(this):("object"==typeof a&&(a=f(a)),void f(this).remove(a))},get form(){return g(f(this).form)}}),e(h,b,document.createElement("select")),a.wrappers.HTMLSelectElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.unwrap,g=a.wrap,h=a.wrapHTMLCollection,i=window.HTMLTableElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get caption(){return g(f(this).caption)},createCaption:function(){return g(f(this).createCaption())},get tHead(){return g(f(this).tHead)},createTHead:function(){return g(f(this).createTHead())},createTFoot:function(){return g(f(this).createTFoot())},get tFoot(){return g(f(this).tFoot)},get tBodies(){return h(f(this).tBodies)},createTBody:function(){return g(f(this).createTBody())},get rows(){return h(f(this).rows)},insertRow:function(a){return g(f(this).insertRow(a))}}),e(i,b,document.createElement("table")),a.wrappers.HTMLTableElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.wrapHTMLCollection,g=a.unwrap,h=a.wrap,i=window.HTMLTableSectionElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get rows(){return f(g(this).rows)},insertRow:function(a){return h(g(this).insertRow(a))}}),e(i,b,document.createElement("thead")),a.wrappers.HTMLTableSectionElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.wrapHTMLCollection,g=a.unwrap,h=a.wrap,i=window.HTMLTableRowElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get cells(){return f(g(this).cells)},insertCell:function(a){return h(g(this).insertCell(a))}}),e(i,b,document.createElement("tr")),a.wrappers.HTMLTableRowElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){switch(a.localName){case"content":return new c(a);case"shadow":return new e(a);case"template":return new f(a)}d.call(this,a)}var c=a.wrappers.HTMLContentElement,d=a.wrappers.HTMLElement,e=a.wrappers.HTMLShadowElement,f=a.wrappers.HTMLTemplateElement,g=(a.mixin,a.registerWrapper),h=window.HTMLUnknownElement;b.prototype=Object.create(d.prototype),g(h,b),a.wrappers.HTMLUnknownElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";var b=a.registerObject,c="http://www.w3.org/2000/svg",d=document.createElementNS(c,"title"),e=b(d),f=Object.getPrototypeOf(e.prototype).constructor;a.wrappers.SVGElement=f}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){m.call(this,a)}var c=a.mixin,d=a.registerWrapper,e=a.unwrap,f=a.wrap,g=window.SVGUseElement,h="http://www.w3.org/2000/svg",i=f(document.createElementNS(h,"g")),j=document.createElementNS(h,"use"),k=i.constructor,l=Object.getPrototypeOf(k.prototype),m=l.constructor;b.prototype=Object.create(l),"instanceRoot"in j&&c(b.prototype,{get instanceRoot(){return f(e(this).instanceRoot)},get animatedInstanceRoot(){return f(e(this).animatedInstanceRoot)}}),d(g,b,j),a.wrappers.SVGUseElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.EventTarget,d=a.mixin,e=a.registerWrapper,f=a.wrap,g=window.SVGElementInstance;g&&(b.prototype=Object.create(c.prototype),d(b.prototype,{get correspondingElement(){return f(this.impl.correspondingElement)},get correspondingUseElement(){return f(this.impl.correspondingUseElement)},get parentNode(){return f(this.impl.parentNode)},get childNodes(){throw new Error("Not implemented")},get firstChild(){return f(this.impl.firstChild)},get lastChild(){return f(this.impl.lastChild)},get previousSibling(){return f(this.impl.previousSibling)},get nextSibling(){return f(this.impl.nextSibling)}}),e(g,b),a.wrappers.SVGElementInstance=b)}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){this.impl=a}var c=a.mixin,d=a.registerWrapper,e=a.unwrap,f=a.unwrapIfNeeded,g=a.wrap,h=window.CanvasRenderingContext2D;c(b.prototype,{get canvas(){return g(this.impl.canvas)},drawImage:function(){arguments[0]=f(arguments[0]),this.impl.drawImage.apply(this.impl,arguments)},createPattern:function(){return arguments[0]=e(arguments[0]),this.impl.createPattern.apply(this.impl,arguments)}}),d(h,b,document.createElement("canvas").getContext("2d")),a.wrappers.CanvasRenderingContext2D=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){this.impl=a}var c=a.mixin,d=a.registerWrapper,e=a.unwrapIfNeeded,f=a.wrap,g=window.WebGLRenderingContext;if(g){c(b.prototype,{get canvas(){return f(this.impl.canvas)},texImage2D:function(){arguments[5]=e(arguments[5]),this.impl.texImage2D.apply(this.impl,arguments)},texSubImage2D:function(){arguments[6]=e(arguments[6]),this.impl.texSubImage2D.apply(this.impl,arguments)}});var h=/WebKit/.test(navigator.userAgent)?{drawingBufferHeight:null,drawingBufferWidth:null}:{};d(g,b,h),a.wrappers.WebGLRenderingContext=b}}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){this.impl=a}var c=a.registerWrapper,d=a.unwrap,e=a.unwrapIfNeeded,f=a.wrap,g=window.Range;b.prototype={get startContainer(){return f(this.impl.startContainer)},get endContainer(){return f(this.impl.endContainer)},get commonAncestorContainer(){return f(this.impl.commonAncestorContainer)},setStart:function(a,b){this.impl.setStart(e(a),b)},setEnd:function(a,b){this.impl.setEnd(e(a),b)},setStartBefore:function(a){this.impl.setStartBefore(e(a))},setStartAfter:function(a){this.impl.setStartAfter(e(a))},setEndBefore:function(a){this.impl.setEndBefore(e(a))},setEndAfter:function(a){this.impl.setEndAfter(e(a))},selectNode:function(a){this.impl.selectNode(e(a))},selectNodeContents:function(a){this.impl.selectNodeContents(e(a))},compareBoundaryPoints:function(a,b){return this.impl.compareBoundaryPoints(a,d(b))},extractContents:function(){return f(this.impl.extractContents())
+},cloneContents:function(){return f(this.impl.cloneContents())},insertNode:function(a){this.impl.insertNode(e(a))},surroundContents:function(a){this.impl.surroundContents(e(a))},cloneRange:function(){return f(this.impl.cloneRange())},isPointInRange:function(a,b){return this.impl.isPointInRange(e(a),b)},comparePoint:function(a,b){return this.impl.comparePoint(e(a),b)},intersectsNode:function(a){return this.impl.intersectsNode(e(a))},toString:function(){return this.impl.toString()}},g.prototype.createContextualFragment&&(b.prototype.createContextualFragment=function(a){return f(this.impl.createContextualFragment(a))}),c(window.Range,b,document.createRange()),a.wrappers.Range=b}(window.ShadowDOMPolyfill),function(a){"use strict";var b=a.GetElementsByInterface,c=a.ParentNodeInterface,d=a.SelectorsInterface,e=a.mixin,f=a.registerObject,g=f(document.createDocumentFragment());e(g.prototype,c),e(g.prototype,d),e(g.prototype,b);var h=f(document.createComment(""));a.wrappers.Comment=h,a.wrappers.DocumentFragment=g}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){var b=k(a.impl.ownerDocument.createDocumentFragment());c.call(this,b),i(b,this),this.treeScope_=new d(this,g(a));var e=a.shadowRoot;m.set(this,e),l.set(this,a)}var c=a.wrappers.DocumentFragment,d=a.TreeScope,e=a.elementFromPoint,f=a.getInnerHTML,g=a.getTreeScope,h=a.mixin,i=a.rewrap,j=a.setInnerHTML,k=a.unwrap,l=new WeakMap,m=new WeakMap,n=/[ \t\n\r\f]/;b.prototype=Object.create(c.prototype),h(b.prototype,{get innerHTML(){return f(this)},set innerHTML(a){j(this,a),this.invalidateShadowRenderer()},get olderShadowRoot(){return m.get(this)||null},get host(){return l.get(this)||null},invalidateShadowRenderer:function(){return l.get(this).invalidateShadowRenderer()},elementFromPoint:function(a,b){return e(this,this.ownerDocument,a,b)},getElementById:function(a){return n.test(a)?null:this.querySelector('[id="'+a+'"]')}}),a.wrappers.ShadowRoot=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){a.previousSibling_=a.previousSibling,a.nextSibling_=a.nextSibling,a.parentNode_=a.parentNode}function c(a,c,e){var f=G(a),g=G(c),h=e?G(e):null;if(d(c),b(c),e)a.firstChild===e&&(a.firstChild_=e),e.previousSibling_=e.previousSibling;else{a.lastChild_=a.lastChild,a.lastChild===a.firstChild&&(a.firstChild_=a.firstChild);var i=H(f.lastChild);i&&(i.nextSibling_=i.nextSibling)}f.insertBefore(g,h)}function d(a){var c=G(a),d=c.parentNode;if(d){var e=H(d);b(a),a.previousSibling&&(a.previousSibling.nextSibling_=a),a.nextSibling&&(a.nextSibling.previousSibling_=a),e.lastChild===a&&(e.lastChild_=a),e.firstChild===a&&(e.firstChild_=a),d.removeChild(c)}}function e(a,b){g(b).push(a),x(a,b);var c=J.get(a);c||J.set(a,c=[]),c.push(b)}function f(a){I.set(a,[])}function g(a){var b=I.get(a);return b||I.set(a,b=[]),b}function h(a){for(var b=[],c=0,d=a.firstChild;d;d=d.nextSibling)b[c++]=d;return b}function i(a,b,c){for(var d=a.firstChild;d;d=d.nextSibling)if(b(d)){if(c(d)===!1)return}else i(d,b,c)}function j(a,b){var c=b.getAttribute("select");if(!c)return!0;if(c=c.trim(),!c)return!0;if(!(a instanceof z))return!1;if("*"===c||c===a.localName)return!0;if(!M.test(c))return!1;if(":"===c[0]&&!N.test(c))return!1;try{return a.matches(c)}catch(d){return!1}}function k(){for(var a=0;a<P.length;a++){var b=P[a],c=b.parentRenderer;c&&c.dirty||b.render()}P=[]}function l(){y=null,k()}function m(a){var b=L.get(a);return b||(b=new q(a),L.set(a,b)),b}function n(a){var b=E(a).root;return b instanceof D?b:null}function o(a){return m(a.host)}function p(a){this.skip=!1,this.node=a,this.childNodes=[]}function q(a){this.host=a,this.dirty=!1,this.invalidateAttributes(),this.associateNode(a)}function r(a){return a instanceof A}function s(a){return a instanceof A}function t(a){return a instanceof B}function u(a){return a instanceof B}function v(a){return a.shadowRoot}function w(a){for(var b=[],c=a.shadowRoot;c;c=c.olderShadowRoot)b.push(c);return b}function x(a,b){K.set(a,b)}var y,z=a.wrappers.Element,A=a.wrappers.HTMLContentElement,B=a.wrappers.HTMLShadowElement,C=a.wrappers.Node,D=a.wrappers.ShadowRoot,E=(a.assert,a.getTreeScope),F=(a.mixin,a.oneOf),G=a.unwrap,H=a.wrap,I=new WeakMap,J=new WeakMap,K=new WeakMap,L=new WeakMap,M=/^[*.:#[a-zA-Z_|]/,N=new RegExp("^:("+["link","visited","target","enabled","disabled","checked","indeterminate","nth-child","nth-last-child","nth-of-type","nth-last-of-type","first-child","last-child","first-of-type","last-of-type","only-of-type"].join("|")+")"),O=F(window,["requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","setTimeout"]),P=[],Q=new ArraySplice;Q.equals=function(a,b){return G(a.node)===b},p.prototype={append:function(a){var b=new p(a);return this.childNodes.push(b),b},sync:function(a){if(!this.skip){for(var b=this.node,e=this.childNodes,f=h(G(b)),g=a||new WeakMap,i=Q.calculateSplices(e,f),j=0,k=0,l=0,m=0;m<i.length;m++){for(var n=i[m];l<n.index;l++)k++,e[j++].sync(g);for(var o=n.removed.length,p=0;o>p;p++){var q=H(f[k++]);g.get(q)||d(q)}for(var r=n.addedCount,s=f[k]&&H(f[k]),p=0;r>p;p++){var t=e[j++],u=t.node;c(b,u,s),g.set(u,!0),t.sync(g)}l+=r}for(var m=l;m<e.length;m++)e[m].sync(g)}}},q.prototype={render:function(a){if(this.dirty){this.invalidateAttributes(),this.treeComposition();var b=this.host,c=b.shadowRoot;this.associateNode(b);for(var d=!e,e=a||new p(b),f=c.firstChild;f;f=f.nextSibling)this.renderNode(c,e,f,!1);d&&e.sync(),this.dirty=!1}},get parentRenderer(){return E(this.host).renderer},invalidate:function(){if(!this.dirty){if(this.dirty=!0,P.push(this),y)return;y=window[O](l,0)}},renderNode:function(a,b,c,d){if(v(c)){b=b.append(c);var e=m(c);e.dirty=!0,e.render(b)}else r(c)?this.renderInsertionPoint(a,b,c,d):t(c)?this.renderShadowInsertionPoint(a,b,c):this.renderAsAnyDomTree(a,b,c,d)},renderAsAnyDomTree:function(a,b,c,d){if(b=b.append(c),v(c)){var e=m(c);b.skip=!e.dirty,e.render(b)}else for(var f=c.firstChild;f;f=f.nextSibling)this.renderNode(a,b,f,d)},renderInsertionPoint:function(a,b,c,d){var e=g(c);if(e.length){this.associateNode(c);for(var f=0;f<e.length;f++){var h=e[f];r(h)&&d?this.renderInsertionPoint(a,b,h,d):this.renderAsAnyDomTree(a,b,h,d)}}else this.renderFallbackContent(a,b,c);this.associateNode(c.parentNode)},renderShadowInsertionPoint:function(a,b,c){var d=a.olderShadowRoot;if(d){x(d,c),this.associateNode(c.parentNode);for(var e=d.firstChild;e;e=e.nextSibling)this.renderNode(d,b,e,!0)}else this.renderFallbackContent(a,b,c)},renderFallbackContent:function(a,b,c){this.associateNode(c),this.associateNode(c.parentNode);for(var d=c.firstChild;d;d=d.nextSibling)this.renderAsAnyDomTree(a,b,d,!1)},invalidateAttributes:function(){this.attributes=Object.create(null)},updateDependentAttributes:function(a){if(a){var b=this.attributes;/\.\w+/.test(a)&&(b["class"]=!0),/#\w+/.test(a)&&(b.id=!0),a.replace(/\[\s*([^\s=\|~\]]+)/g,function(a,c){b[c]=!0})}},dependsOnAttribute:function(a){return this.attributes[a]},distribute:function(a,b){var c=this;i(a,s,function(a){f(a),c.updateDependentAttributes(a.getAttribute("select"));for(var d=0;d<b.length;d++){var g=b[d];void 0!==g&&j(g,a)&&(e(g,a),b[d]=void 0)}})},treeComposition:function(){for(var a=this.host,b=a.shadowRoot,c=[],d=a.firstChild;d;d=d.nextSibling)if(r(d)){var e=g(d);e&&e.length||(e=h(d)),c.push.apply(c,e)}else c.push(d);for(var f,j;b;){if(f=void 0,i(b,u,function(a){return f=a,!1}),j=f,this.distribute(b,c),j){var k=b.olderShadowRoot;if(k){b=k,x(b,j);continue}break}break}},associateNode:function(a){a.impl.polymerShadowRenderer_=this}},C.prototype.invalidateShadowRenderer=function(){var a=this.impl.polymerShadowRenderer_;return a?(a.invalidate(),!0):!1},A.prototype.getDistributedNodes=function(){return k(),g(this)},B.prototype.nodeIsInserted_=A.prototype.nodeIsInserted_=function(){this.invalidateShadowRenderer();var a,b=n(this);b&&(a=o(b)),this.impl.polymerShadowRenderer_=a,a&&a.invalidate()},a.eventParentsTable=J,a.getRendererForHost=m,a.getShadowTrees=w,a.insertionParentTable=K,a.renderAllPending=k,a.visual={insertBefore:c,remove:d}}(window.ShadowDOMPolyfill),function(a){"use strict";function b(b){if(window[b]){d(!a.wrappers[b]);var i=function(a){c.call(this,a)};i.prototype=Object.create(c.prototype),e(i.prototype,{get form(){return h(g(this).form)}}),f(window[b],i,document.createElement(b.slice(4,-7))),a.wrappers[b]=i}}var c=a.wrappers.HTMLElement,d=a.assert,e=a.mixin,f=a.registerWrapper,g=a.unwrap,h=a.wrap,i=["HTMLButtonElement","HTMLFieldSetElement","HTMLInputElement","HTMLKeygenElement","HTMLLabelElement","HTMLLegendElement","HTMLObjectElement","HTMLOutputElement","HTMLTextAreaElement"];i.forEach(b)}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){this.impl=a}{var c=a.registerWrapper,d=a.unwrap,e=a.unwrapIfNeeded,f=a.wrap;window.Selection}b.prototype={get anchorNode(){return f(this.impl.anchorNode)},get focusNode(){return f(this.impl.focusNode)},addRange:function(a){this.impl.addRange(d(a))},collapse:function(a,b){this.impl.collapse(e(a),b)},containsNode:function(a,b){return this.impl.containsNode(e(a),b)},extend:function(a,b){this.impl.extend(e(a),b)},getRangeAt:function(a){return f(this.impl.getRangeAt(a))},removeRange:function(a){this.impl.removeRange(d(a))},selectAllChildren:function(a){this.impl.selectAllChildren(e(a))},toString:function(){return this.impl.toString()}},c(window.Selection,b,window.getSelection()),a.wrappers.Selection=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){k.call(this,a),this.treeScope_=new p(this,null)}function c(a){var c=document[a];b.prototype[a]=function(){return A(c.apply(this.impl,arguments))}}function d(a,b){D.call(b.impl,z(a)),e(a,b)}function e(a,b){a.shadowRoot&&b.adoptNode(a.shadowRoot),a instanceof o&&f(a,b);for(var c=a.firstChild;c;c=c.nextSibling)e(c,b)}function f(a,b){var c=a.olderShadowRoot;c&&b.adoptNode(c)}function g(a){this.impl=a}function h(a,b){var c=document.implementation[b];a.prototype[b]=function(){return A(c.apply(this.impl,arguments))}}function i(a,b){var c=document.implementation[b];a.prototype[b]=function(){return c.apply(this.impl,arguments)}}var j=a.GetElementsByInterface,k=a.wrappers.Node,l=a.ParentNodeInterface,m=a.wrappers.Selection,n=a.SelectorsInterface,o=a.wrappers.ShadowRoot,p=a.TreeScope,q=a.cloneNode,r=a.defineWrapGetter,s=a.elementFromPoint,t=a.forwardMethodsToWrapper,u=a.matchesNames,v=a.mixin,w=a.registerWrapper,x=a.renderAllPending,y=a.rewrap,z=a.unwrap,A=a.wrap,B=a.wrapEventTargetMethods,C=(a.wrapNodeList,new WeakMap);b.prototype=Object.create(k.prototype),r(b,"documentElement"),r(b,"body"),r(b,"head"),["createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode","getElementById"].forEach(c);var D=document.adoptNode,E=document.getSelection;if(v(b.prototype,{adoptNode:function(a){return a.parentNode&&a.parentNode.removeChild(a),d(a,this),a},elementFromPoint:function(a,b){return s(this,this,a,b)},importNode:function(a,b){return q(a,b,this.impl)},getSelection:function(){return x(),new m(E.call(z(this)))}}),document.registerElement){var F=document.registerElement;b.prototype.registerElement=function(b,c){function d(a){return a?void(this.impl=a):f?document.createElement(f,b):document.createElement(b)}var e,f;if(void 0!==c&&(e=c.prototype,f=c.extends),e||(e=Object.create(HTMLElement.prototype)),a.nativePrototypeTable.get(e))throw new Error("NotSupportedError");for(var g,h=Object.getPrototypeOf(e),i=[];h&&!(g=a.nativePrototypeTable.get(h));)i.push(h),h=Object.getPrototypeOf(h);if(!g)throw new Error("NotSupportedError");for(var j=Object.create(g),k=i.length-1;k>=0;k--)j=Object.create(j);["createdCallback","attachedCallback","detachedCallback","attributeChangedCallback"].forEach(function(a){var b=e[a];b&&(j[a]=function(){A(this)instanceof d||y(this),b.apply(A(this),arguments)})});var l={prototype:j};f&&(l.extends=f),d.prototype=e,d.prototype.constructor=d,a.constructorTable.set(j,d),a.nativePrototypeTable.set(e,j);F.call(z(this),b,l);return d},t([window.HTMLDocument||window.Document],["registerElement"])}t([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement,window.HTMLHtmlElement],["appendChild","compareDocumentPosition","contains","getElementsByClassName","getElementsByTagName","getElementsByTagNameNS","insertBefore","querySelector","querySelectorAll","removeChild","replaceChild"].concat(u)),t([window.HTMLDocument||window.Document],["adoptNode","importNode","contains","createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode","elementFromPoint","getElementById","getSelection"]),v(b.prototype,j),v(b.prototype,l),v(b.prototype,n),v(b.prototype,{get implementation(){var a=C.get(this);return a?a:(a=new g(z(this).implementation),C.set(this,a),a)}}),w(window.Document,b,document.implementation.createHTMLDocument("")),window.HTMLDocument&&w(window.HTMLDocument,b),B([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement]),h(g,"createDocumentType"),h(g,"createDocument"),h(g,"createHTMLDocument"),i(g,"hasFeature"),w(window.DOMImplementation,g),t([window.DOMImplementation],["createDocumentType","createDocument","createHTMLDocument","hasFeature"]),a.adoptNodeNoRemove=d,a.wrappers.DOMImplementation=g,a.wrappers.Document=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.EventTarget,d=a.wrappers.Selection,e=a.mixin,f=a.registerWrapper,g=a.renderAllPending,h=a.unwrap,i=a.unwrapIfNeeded,j=a.wrap,k=window.Window,l=window.getComputedStyle,m=window.getSelection;b.prototype=Object.create(c.prototype),k.prototype.getComputedStyle=function(a,b){return j(this||window).getComputedStyle(i(a),b)},k.prototype.getSelection=function(){return j(this||window).getSelection()},delete window.getComputedStyle,delete window.getSelection,["addEventListener","removeEventListener","dispatchEvent"].forEach(function(a){k.prototype[a]=function(){var b=j(this||window);return b[a].apply(b,arguments)},delete window[a]}),e(b.prototype,{getComputedStyle:function(a,b){return g(),l.call(h(this),i(a),b)},getSelection:function(){return g(),new d(m.call(h(this)))}}),f(k,b),a.wrappers.Window=b}(window.ShadowDOMPolyfill),function(a){"use strict";var b=a.unwrap,c=window.DataTransfer||window.Clipboard,d=c.prototype.setDragImage;c.prototype.setDragImage=function(a,c,e){d.call(this,b(a),c,e)}}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){var b=c[a],d=window[b];if(d){var e=document.createElement(a),f=e.constructor;window[b]=f}}var c=(a.isWrapperFor,{a:"HTMLAnchorElement",area:"HTMLAreaElement",audio:"HTMLAudioElement",base:"HTMLBaseElement",body:"HTMLBodyElement",br:"HTMLBRElement",button:"HTMLButtonElement",canvas:"HTMLCanvasElement",caption:"HTMLTableCaptionElement",col:"HTMLTableColElement",content:"HTMLContentElement",data:"HTMLDataElement",datalist:"HTMLDataListElement",del:"HTMLModElement",dir:"HTMLDirectoryElement",div:"HTMLDivElement",dl:"HTMLDListElement",embed:"HTMLEmbedElement",fieldset:"HTMLFieldSetElement",font:"HTMLFontElement",form:"HTMLFormElement",frame:"HTMLFrameElement",frameset:"HTMLFrameSetElement",h1:"HTMLHeadingElement",head:"HTMLHeadElement",hr:"HTMLHRElement",html:"HTMLHtmlElement",iframe:"HTMLIFrameElement",img:"HTMLImageElement",input:"HTMLInputElement",keygen:"HTMLKeygenElement",label:"HTMLLabelElement",legend:"HTMLLegendElement",li:"HTMLLIElement",link:"HTMLLinkElement",map:"HTMLMapElement",marquee:"HTMLMarqueeElement",menu:"HTMLMenuElement",menuitem:"HTMLMenuItemElement",meta:"HTMLMetaElement",meter:"HTMLMeterElement",object:"HTMLObjectElement",ol:"HTMLOListElement",optgroup:"HTMLOptGroupElement",option:"HTMLOptionElement",output:"HTMLOutputElement",p:"HTMLParagraphElement",param:"HTMLParamElement",pre:"HTMLPreElement",progress:"HTMLProgressElement",q:"HTMLQuoteElement",script:"HTMLScriptElement",select:"HTMLSelectElement",shadow:"HTMLShadowElement",source:"HTMLSourceElement",span:"HTMLSpanElement",style:"HTMLStyleElement",table:"HTMLTableElement",tbody:"HTMLTableSectionElement",template:"HTMLTemplateElement",textarea:"HTMLTextAreaElement",thead:"HTMLTableSectionElement",time:"HTMLTimeElement",title:"HTMLTitleElement",tr:"HTMLTableRowElement",track:"HTMLTrackElement",ul:"HTMLUListElement",video:"HTMLVideoElement"});Object.keys(c).forEach(b),Object.getOwnPropertyNames(a.wrappers).forEach(function(b){window[b]=a.wrappers[b]})}(window.ShadowDOMPolyfill),function(){window.wrap=ShadowDOMPolyfill.wrapIfNeeded,window.unwrap=ShadowDOMPolyfill.unwrapIfNeeded,Object.defineProperty(Element.prototype,"webkitShadowRoot",Object.getOwnPropertyDescriptor(Element.prototype,"shadowRoot"));var a=Element.prototype.createShadowRoot;Element.prototype.createShadowRoot=function(){var b=a.call(this);return CustomElements.watchShadow(this),b},Element.prototype.webkitCreateShadowRoot=Element.prototype.createShadowRoot}(),function(a){function b(a,b){var c="";return Array.prototype.forEach.call(a,function(a){c+=a.textContent+"\n\n"}),b||(c=c.replace(l,"")),c}function c(a){var b=document.createElement("style");return b.textContent=a,b}function d(a){var b=c(a);document.head.appendChild(b);var d=[];if(b.sheet)try{d=b.sheet.cssRules}catch(e){}else console.warn("sheet not found",b);return b.parentNode.removeChild(b),d}function e(){v.initialized=!0,document.body.appendChild(v);var a=v.contentDocument,b=a.createElement("base");b.href=document.baseURI,a.head.appendChild(b)}function f(a){v.initialized||e(),document.body.appendChild(v),a(v.contentDocument),document.body.removeChild(v)}function g(a,b){if(b){var e;if(a.match("@import")&&x){var g=c(a);f(function(a){a.head.appendChild(g.impl),e=g.sheet.cssRules,b(e)})}else e=d(a),b(e)}}function h(a){a&&j().appendChild(document.createTextNode(a))}function i(a,b){var d=c(a);d.setAttribute(b,""),d.setAttribute(z,""),document.head.appendChild(d)}function j(){return w||(w=document.createElement("style"),w.setAttribute(z,""),w[z]=!0),w}var k={strictStyling:!1,registry:{},shimStyling:function(a,c,d){var e=this.prepareRoot(a,c,d),f=this.isTypeExtension(d),g=this.makeScopeSelector(c,f),h=b(e,!0);h=this.scopeCssText(h,g),a&&(a.shimmedStyle=h),this.addCssToDocument(h,c)},shimStyle:function(a,b){return this.shimCssText(a.textContent,b)},shimCssText:function(a,b){return a=this.insertDirectives(a),this.scopeCssText(a,b)},makeScopeSelector:function(a,b){return a?b?"[is="+a+"]":a:""},isTypeExtension:function(a){return a&&a.indexOf("-")<0},prepareRoot:function(a,b,c){var d=this.registerRoot(a,b,c);return this.replaceTextInStyles(d.rootStyles,this.insertDirectives),this.removeStyles(a,d.rootStyles),this.strictStyling&&this.applyScopeToContent(a,b),d.scopeStyles},removeStyles:function(a,b){for(var c,d=0,e=b.length;e>d&&(c=b[d]);d++)c.parentNode.removeChild(c)},registerRoot:function(a,b,c){var d=this.registry[b]={root:a,name:b,extendsName:c},e=this.findStyles(a);d.rootStyles=e,d.scopeStyles=d.rootStyles;var f=this.registry[d.extendsName];return f&&(d.scopeStyles=f.scopeStyles.concat(d.scopeStyles)),d},findStyles:function(a){if(!a)return[];var b=a.querySelectorAll("style");return Array.prototype.filter.call(b,function(a){return!a.hasAttribute(A)})},applyScopeToContent:function(a,b){a&&(Array.prototype.forEach.call(a.querySelectorAll("*"),function(a){a.setAttribute(b,"")}),Array.prototype.forEach.call(a.querySelectorAll("template"),function(a){this.applyScopeToContent(a.content,b)},this))},insertDirectives:function(a){return a=this.insertPolyfillDirectivesInCssText(a),this.insertPolyfillRulesInCssText(a)},insertPolyfillDirectivesInCssText:function(a){return a=a.replace(m,function(a,b){return b.slice(0,-2)+"{"}),a.replace(n,function(a,b){return b+" {"})},insertPolyfillRulesInCssText:function(a){return a=a.replace(o,function(a,b){return b.slice(0,-1)}),a.replace(p,function(a,b,c,d){var e=a.replace(b,"").replace(c,"");return d+e})},scopeCssText:function(a,b){var c=this.extractUnscopedRulesFromCssText(a);if(a=this.insertPolyfillHostInCssText(a),a=this.convertColonHost(a),a=this.convertColonHostContext(a),a=this.convertCombinators(a),b){var a,d=this;g(a,function(c){a=d.scopeRules(c,b)})}return a=a+"\n"+c,a.trim()},extractUnscopedRulesFromCssText:function(a){for(var b,c="";b=q.exec(a);)c+=b[1].slice(0,-1)+"\n\n";for(;b=r.exec(a);)c+=b[0].replace(b[2],"").replace(b[1],b[3])+"\n\n";return c},convertColonHost:function(a){return this.convertColonRule(a,cssColonHostRe,this.colonHostPartReplacer)},convertColonHostContext:function(a){return this.convertColonRule(a,cssColonHostContextRe,this.colonHostContextPartReplacer)},convertColonRule:function(a,b,c){return a.replace(b,function(a,b,d,e){if(b=polyfillHostNoCombinator,d){for(var f,g=d.split(","),h=[],i=0,j=g.length;j>i&&(f=g[i]);i++)f=f.trim(),h.push(c(b,f,e));return h.join(",")}return b+e})},colonHostContextPartReplacer:function(a,b,c){return b.match(s)?this.colonHostPartReplacer(a,b,c):a+b+c+", "+b+" "+a+c},colonHostPartReplacer:function(a,b,c){return a+b.replace(s,"")+c},convertCombinators:function(a){for(var b=0;b<combinatorsRe.length;b++)a=a.replace(combinatorsRe[b]," ");return a},scopeRules:function(a,b){var c="";return a&&Array.prototype.forEach.call(a,function(a){a.selectorText&&a.style&&a.style.cssText?(c+=this.scopeSelector(a.selectorText,b,this.strictStyling)+" {\n	",c+=this.propertiesFromRule(a)+"\n}\n\n"):a.type===CSSRule.MEDIA_RULE?(c+="@media "+a.media.mediaText+" {\n",c+=this.scopeRules(a.cssRules,b),c+="\n}\n\n"):a.cssText&&(c+=a.cssText+"\n\n")},this),c},scopeSelector:function(a,b,c){var d=[],e=a.split(",");return e.forEach(function(a){a=a.trim(),this.selectorNeedsScoping(a,b)&&(a=c&&!a.match(polyfillHostNoCombinator)?this.applyStrictSelectorScope(a,b):this.applySelectorScope(a,b)),d.push(a)},this),d.join(", ")},selectorNeedsScoping:function(a,b){if(Array.isArray(b))return!0;var c=this.makeScopeMatcher(b);return!a.match(c)},makeScopeMatcher:function(a){return a=a.replace(/\[/g,"\\[").replace(/\[/g,"\\]"),new RegExp("^("+a+")"+selectorReSuffix,"m")},applySelectorScope:function(a,b){return Array.isArray(b)?this.applySelectorScopeList(a,b):this.applySimpleSelectorScope(a,b)},applySelectorScopeList:function(a,b){for(var c,d=[],e=0;c=b[e];e++)d.push(this.applySimpleSelectorScope(a,c));return d.join(", ")},applySimpleSelectorScope:function(a,b){return a.match(polyfillHostRe)?(a=a.replace(polyfillHostNoCombinator,b),a.replace(polyfillHostRe,b+" ")):b+" "+a},applyStrictSelectorScope:function(a,b){b=b.replace(/\[is=([^\]]*)\]/g,"$1");var c=[" ",">","+","~"],d=a,e="["+b+"]";return c.forEach(function(a){var b=d.split(a);d=b.map(function(a){var b=a.trim().replace(polyfillHostRe,"");return b&&c.indexOf(b)<0&&b.indexOf(e)<0&&(a=b.replace(/([^:]*)(:*)(.*)/,"$1"+e+"$2$3")),a}).join(a)}),d},insertPolyfillHostInCssText:function(a){return a.replace(colonHostContextRe,t).replace(colonHostRe,s)},propertiesFromRule:function(a){var b=a.style.cssText;a.style.content&&!a.style.content.match(/['"]+|attr/)&&(b=b.replace(/content:[^;]*;/g,"content: '"+a.style.content+"';"));var c=a.style;for(var d in c)"initial"===c[d]&&(b+=d+": initial; ");return b},replaceTextInStyles:function(a,b){a&&b&&(a instanceof Array||(a=[a]),Array.prototype.forEach.call(a,function(a){a.textContent=b.call(this,a.textContent)},this))},addCssToDocument:function(a,b){a.match("@import")?i(a,b):h(a)}},l=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim,m=/\/\*\s*@polyfill ([^*]*\*+([^/*][^*]*\*+)*\/)([^{]*?){/gim,n=/polyfill-next-selector[^}]*content\:[\s]*'([^']*)'[^}]*}([^{]*?){/gim,o=/\/\*\s@polyfill-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,p=/(polyfill-rule)[^}]*(content\:[\s]*'([^']*)'[^;]*;)[^}]*}/gim,q=/\/\*\s@polyfill-unscoped-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,r=/(polyfill-unscoped-rule)[^}]*(content\:[\s]*'([^']*)'[^;]*;)[^}]*}/gim,s="-shadowcsshost",t="-shadowcsscontext",u=")(?:\\(((?:\\([^)(]*\\)|[^)(]*)+?)\\))?([^,{]*)";cssColonHostRe=new RegExp("("+s+u,"gim"),cssColonHostContextRe=new RegExp("("+t+u,"gim"),selectorReSuffix="([>\\s~+[.,{:][\\s\\S]*)?$",colonHostRe=/\:host/gim,colonHostContextRe=/\:host-context/gim,polyfillHostNoCombinator=s+"-no-combinator",polyfillHostRe=new RegExp(s,"gim"),polyfillHostContextRe=new RegExp(t,"gim"),combinatorsRe=[/\^\^/g,/\^/g,/\/shadow\//g,/\/shadow-deep\//g,/::shadow/g,/\/deep\//g];var v=document.createElement("iframe");v.style.display="none";var w,x=navigator.userAgent.match("Chrome"),y="shim-shadowdom",z="shim-shadowdom-css",A="no-shim";if(window.ShadowDOMPolyfill){h("style { display: none !important; }\n");var B=wrap(document),C=B.querySelector("head");C.insertBefore(j(),C.childNodes[0]),document.addEventListener("DOMContentLoaded",function(){var b=a.urlResolver;if(window.HTMLImports&&!HTMLImports.useNative){var c="link[rel=stylesheet]["+y+"]",d="style["+y+"]";HTMLImports.importer.documentPreloadSelectors+=","+c,HTMLImports.importer.importsPreloadSelectors+=","+c,HTMLImports.parser.documentSelectors=[HTMLImports.parser.documentSelectors,c,d].join(",");var e=HTMLImports.parser.parseGeneric;HTMLImports.parser.parseGeneric=function(a){if(!a[z]){var c=a.__importElement||a;if(!c.hasAttribute(y))return void e.call(this,a);a.__resource?(c=a.ownerDocument.createElement("style"),c.textContent=b.resolveCssText(a.__resource,a.href)):b.resolveStyle(c),c.textContent=k.shimStyle(c),c.removeAttribute(y,""),c.setAttribute(z,""),c[z]=!0,c.parentNode!==C&&(a.parentNode===C?C.replaceChild(c,a):C.appendChild(c)),c.__importParsed=!0,this.markParsingComplete(a)}};var f=HTMLImports.parser.hasResource;HTMLImports.parser.hasResource=function(a){return"link"===a.localName&&"stylesheet"===a.rel&&a.hasAttribute(y)?a.__resource:f.call(this,a)}}})}a.ShadowCSS=k}(window.Platform)):!function(){window.templateContent=window.templateContent||function(a){return a.content},window.wrap=window.unwrap=function(a){return a},addEventListener("DOMContentLoaded",function(){if(CustomElements.useNative===!1){var a=Element.prototype.createShadowRoot;Element.prototype.createShadowRoot=function(){var b=a.call(this);return CustomElements.watchShadow(this),b}}}),window.templateContent=function(a){if(window.HTMLTemplateElement&&HTMLTemplateElement.bootstrap&&HTMLTemplateElement.bootstrap(a),!a.content&&!a._content){for(var b=document.createDocumentFragment();a.firstChild;)b.appendChild(a.firstChild);a._content=b}return a.content||a._content}}(),function(a){"use strict";function b(a){return void 0!==m[a]}function c(){h.call(this),this._isInvalid=!0}function d(a){return""==a&&c.call(this),a.toLowerCase()}function e(a){var b=a.charCodeAt(0);return b>32&&127>b&&-1==[34,35,60,62,63,96].indexOf(b)?a:encodeURIComponent(a)}function f(a){var b=a.charCodeAt(0);return b>32&&127>b&&-1==[34,35,60,62,96].indexOf(b)?a:encodeURIComponent(a)}function g(a,g,h){function i(a){t.push(a)}var j=g||"scheme start",k=0,l="",r=!1,s=!1,t=[];a:for(;(a[k-1]!=o||0==k)&&!this._isInvalid;){var u=a[k];switch(j){case"scheme start":if(!u||!p.test(u)){if(g){i("Invalid scheme.");break a}l="",j="no scheme";continue}l+=u.toLowerCase(),j="scheme";break;case"scheme":if(u&&q.test(u))l+=u.toLowerCase();else{if(":"!=u){if(g){if(o==u)break a;i("Code point not allowed in scheme: "+u);break a}l="",k=0,j="no scheme";continue}if(this._scheme=l,l="",g)break a;b(this._scheme)&&(this._isRelative=!0),j="file"==this._scheme?"relative":this._isRelative&&h&&h._scheme==this._scheme?"relative or authority":this._isRelative?"authority first slash":"scheme data"}break;case"scheme data":"?"==u?(query="?",j="query"):"#"==u?(this._fragment="#",j="fragment"):o!=u&&"	"!=u&&"\n"!=u&&"\r"!=u&&(this._schemeData+=e(u));break;case"no scheme":if(h&&b(h._scheme)){j="relative";continue}i("Missing scheme."),c.call(this);break;case"relative or authority":if("/"!=u||"/"!=a[k+1]){i("Expected /, got: "+u),j="relative";continue}j="authority ignore slashes";break;case"relative":if(this._isRelative=!0,"file"!=this._scheme&&(this._scheme=h._scheme),o==u){this._host=h._host,this._port=h._port,this._path=h._path.slice(),this._query=h._query;break a}if("/"==u||"\\"==u)"\\"==u&&i("\\ is an invalid code point."),j="relative slash";else if("?"==u)this._host=h._host,this._port=h._port,this._path=h._path.slice(),this._query="?",j="query";else{if("#"!=u){var v=a[k+1],w=a[k+2];("file"!=this._scheme||!p.test(u)||":"!=v&&"|"!=v||o!=w&&"/"!=w&&"\\"!=w&&"?"!=w&&"#"!=w)&&(this._host=h._host,this._port=h._port,this._path=h._path.slice(),this._path.pop()),j="relative path";continue}this._host=h._host,this._port=h._port,this._path=h._path.slice(),this._query=h._query,this._fragment="#",j="fragment"}break;case"relative slash":if("/"!=u&&"\\"!=u){"file"!=this._scheme&&(this._host=h._host,this._port=h._port),j="relative path";continue}"\\"==u&&i("\\ is an invalid code point."),j="file"==this._scheme?"file host":"authority ignore slashes";break;case"authority first slash":if("/"!=u){i("Expected '/', got: "+u),j="authority ignore slashes";continue}j="authority second slash";break;case"authority second slash":if(j="authority ignore slashes","/"!=u){i("Expected '/', got: "+u);continue}break;case"authority ignore slashes":if("/"!=u&&"\\"!=u){j="authority";continue}i("Expected authority, got: "+u);break;case"authority":if("@"==u){r&&(i("@ already seen."),l+="%40"),r=!0;for(var x=0;x<l.length;x++){var y=l[x];if("	"!=y&&"\n"!=y&&"\r"!=y)if(":"!=y||null!==this._password){var z=e(y);null!==this._password?this._password+=z:this._username+=z}else this._password="";else i("Invalid whitespace in authority.")}l=""}else{if(o==u||"/"==u||"\\"==u||"?"==u||"#"==u){k-=l.length,l="",j="host";continue}l+=u}break;case"file host":if(o==u||"/"==u||"\\"==u||"?"==u||"#"==u){2!=l.length||!p.test(l[0])||":"!=l[1]&&"|"!=l[1]?0==l.length?j="relative path start":(this._host=d.call(this,l),l="",j="relative path start"):j="relative path";continue}"	"==u||"\n"==u||"\r"==u?i("Invalid whitespace in file host."):l+=u;break;case"host":case"hostname":if(":"!=u||s){if(o==u||"/"==u||"\\"==u||"?"==u||"#"==u){if(this._host=d.call(this,l),l="",j="relative path start",g)break a;continue}"	"!=u&&"\n"!=u&&"\r"!=u?("["==u?s=!0:"]"==u&&(s=!1),l+=u):i("Invalid code point in host/hostname: "+u)}else if(this._host=d.call(this,l),l="",j="port","hostname"==g)break a;break;case"port":if(/[0-9]/.test(u))l+=u;else{if(o==u||"/"==u||"\\"==u||"?"==u||"#"==u||g){if(""!=l){var A=parseInt(l,10);A!=m[this._scheme]&&(this._port=A+""),l=""}if(g)break a;j="relative path start";continue}"	"==u||"\n"==u||"\r"==u?i("Invalid code point in port: "+u):c.call(this)}break;case"relative path start":if("\\"==u&&i("'\\' not allowed in path."),j="relative path","/"!=u&&"\\"!=u)continue;break;case"relative path":if(o!=u&&"/"!=u&&"\\"!=u&&(g||"?"!=u&&"#"!=u))"	"!=u&&"\n"!=u&&"\r"!=u&&(l+=e(u));else{"\\"==u&&i("\\ not allowed in relative path.");var B;(B=n[l.toLowerCase()])&&(l=B),".."==l?(this._path.pop(),"/"!=u&&"\\"!=u&&this._path.push("")):"."==l&&"/"!=u&&"\\"!=u?this._path.push(""):"."!=l&&("file"==this._scheme&&0==this._path.length&&2==l.length&&p.test(l[0])&&"|"==l[1]&&(l=l[0]+":"),this._path.push(l)),l="","?"==u?(this._query="?",j="query"):"#"==u&&(this._fragment="#",j="fragment")}break;case"query":g||"#"!=u?o!=u&&"	"!=u&&"\n"!=u&&"\r"!=u&&(this._query+=f(u)):(this._fragment="#",j="fragment");break;case"fragment":o!=u&&"	"!=u&&"\n"!=u&&"\r"!=u&&(this._fragment+=u)}k++}}function h(){this._scheme="",this._schemeData="",this._username="",this._password=null,this._host="",this._port="",this._path=[],this._query="",this._fragment="",this._isInvalid=!1,this._isRelative=!1}function i(a,b){void 0===b||b instanceof i||(b=new i(String(b))),this._url=a,h.call(this);var c=a.replace(/^[ \t\r\n\f]+|[ \t\r\n\f]+$/g,"");g.call(this,c,null,b)}var j=!1;if(!a.forceJURL)try{var k=new URL("b","http://a");j="http://a/b"===k.href}catch(l){}if(!j){var m=Object.create(null);m.ftp=21,m.file=0,m.gopher=70,m.http=80,m.https=443,m.ws=80,m.wss=443;var n=Object.create(null);n["%2e"]=".",n[".%2e"]="..",n["%2e."]="..",n["%2e%2e"]="..";var o=void 0,p=/[a-zA-Z]/,q=/[a-zA-Z0-9\+\-\.]/;i.prototype={get href(){if(this._isInvalid)return this._url;
+var a="";return(""!=this._username||null!=this._password)&&(a=this._username+(null!=this._password?":"+this._password:"")+"@"),this.protocol+(this._isRelative?"//"+a+this.host:"")+this.pathname+this._query+this._fragment},set href(a){h.call(this),g.call(this,a)},get protocol(){return this._scheme+":"},set protocol(a){this._isInvalid||g.call(this,a+":","scheme start")},get host(){return this._isInvalid?"":this._port?this._host+":"+this._port:this._host},set host(a){!this._isInvalid&&this._isRelative&&g.call(this,a,"host")},get hostname(){return this._host},set hostname(a){!this._isInvalid&&this._isRelative&&g.call(this,a,"hostname")},get port(){return this._port},set port(a){!this._isInvalid&&this._isRelative&&g.call(this,a,"port")},get pathname(){return this._isInvalid?"":this._isRelative?"/"+this._path.join("/"):this._schemeData},set pathname(a){!this._isInvalid&&this._isRelative&&(this._path=[],g.call(this,a,"relative path start"))},get search(){return this._isInvalid||!this._query||"?"==this._query?"":this._query},set search(a){!this._isInvalid&&this._isRelative&&(this._query="?","?"==a[0]&&(a=a.slice(1)),g.call(this,a,"query"))},get hash(){return this._isInvalid||!this._fragment||"#"==this._fragment?"":this._fragment},set hash(a){this._isInvalid||(this._fragment="#","#"==a[0]&&(a=a.slice(1)),g.call(this,a,"fragment"))}},a.URL=i}}(window),function(a){function b(a){for(var b=a||{},d=1;d<arguments.length;d++){var e=arguments[d];try{for(var f in e)c(f,e,b)}catch(g){}}return b}function c(a,b,c){var e=d(b,a);Object.defineProperty(c,a,e)}function d(a,b){if(a){var c=Object.getOwnPropertyDescriptor(a,b);return c||d(Object.getPrototypeOf(a),b)}}Function.prototype.bind||(Function.prototype.bind=function(a){var b=this,c=Array.prototype.slice.call(arguments,1);return function(){var d=c.slice();return d.push.apply(d,arguments),b.apply(a,d)}}),a.mixin=b}(window.Platform),function(a){"use strict";function b(a,b,c){var d="string"==typeof a?document.createElement(a):a.cloneNode(!0);if(d.innerHTML=b,c)for(var e in c)d.setAttribute(e,c[e]);return d}var c=DOMTokenList.prototype.add,d=DOMTokenList.prototype.remove;DOMTokenList.prototype.add=function(){for(var a=0;a<arguments.length;a++)c.call(this,arguments[a])},DOMTokenList.prototype.remove=function(){for(var a=0;a<arguments.length;a++)d.call(this,arguments[a])},DOMTokenList.prototype.toggle=function(a,b){1==arguments.length&&(b=!this.contains(a)),b?this.add(a):this.remove(a)},DOMTokenList.prototype.switch=function(a,b){a&&this.remove(a),b&&this.add(b)};var e=function(){return Array.prototype.slice.call(this)},f=window.NamedNodeMap||window.MozNamedAttrMap||{};if(NodeList.prototype.array=e,f.prototype.array=e,HTMLCollection.prototype.array=e,!window.performance){var g=Date.now();window.performance={now:function(){return Date.now()-g}}}window.requestAnimationFrame||(window.requestAnimationFrame=function(){var a=window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame;return a?function(b){return a(function(){b(performance.now())})}:function(a){return window.setTimeout(a,1e3/60)}}()),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(){return window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||function(a){clearTimeout(a)}}());var h=[],i=function(){h.push(arguments)};window.Polymer=i,a.deliverDeclarations=function(){return a.deliverDeclarations=function(){throw"Possible attempt to load Polymer twice"},h},window.addEventListener("DOMContentLoaded",function(){window.Polymer===i&&(window.Polymer=function(){console.error('You tried to use polymer without loading it first. To load polymer, <link rel="import" href="components/polymer/polymer.html">')})}),a.createDOM=b}(window.Platform),window.templateContent=window.templateContent||function(a){return a.content},function(a){a=a||(window.Inspector={});var b;window.sinspect=function(a,d){b||(b=window.open("","ShadowDOM Inspector",null,!0),b.document.write(c),b.api={shadowize:shadowize}),f(a||wrap(document.body),d)};var c=["<!DOCTYPE html>","<html>","  <head>","    <title>ShadowDOM Inspector</title>","    <style>","      body {","      }","      pre {",'        font: 9pt "Courier New", monospace;',"        line-height: 1.5em;","      }","      tag {","        color: purple;","      }","      ul {","         margin: 0;","         padding: 0;","         list-style: none;","      }","      li {","         display: inline-block;","         background-color: #f1f1f1;","         padding: 4px 6px;","         border-radius: 4px;","         margin-right: 4px;","      }","    </style>","  </head>","  <body>",'    <ul id="crumbs">',"    </ul>",'    <div id="tree"></div>',"  </body>","</html>"].join("\n"),d=[],e=function(){var a=b.document,c=a.querySelector("#crumbs");c.textContent="";for(var e,g=0;e=d[g];g++){var h=a.createElement("a");h.href="#",h.textContent=e.localName,h.idx=g,h.onclick=function(a){for(var b;d.length>this.idx;)b=d.pop();f(b.shadow||b,b),a.preventDefault()},c.appendChild(a.createElement("li")).appendChild(h)}},f=function(a,c){var f=b.document;k=[];var g=c||a;d.push(g),e(),f.body.querySelector("#tree").innerHTML="<pre>"+j(a,a.childNodes)+"</pre>"},g=Array.prototype.forEach.call.bind(Array.prototype.forEach),h={STYLE:1,SCRIPT:1,"#comment":1,TEMPLATE:1},i=function(a){return h[a.nodeName]},j=function(a,b,c){if(i(a))return"";var d=c||"";if(a.localName||11==a.nodeType){var e=a.localName||"shadow-root",f=d+l(a);"content"==e&&(b=a.getDistributedNodes()),f+="<br/>";var h=d+"&nbsp;&nbsp;";g(b,function(a){f+=j(a,a.childNodes,h)}),f+=d,{br:1}[e]||(f+="<tag>&lt;/"+e+"&gt;</tag>",f+="<br/>")}else{var k=a.textContent.trim();f=k?d+'"'+k+'"<br/>':""}return f},k=[],l=function(a){var b="<tag>&lt;",c=a.localName||"shadow-root";return a.webkitShadowRoot||a.shadowRoot?(b+=' <button idx="'+k.length+'" onclick="api.shadowize.call(this)">'+c+"</button>",k.push(a)):b+=c||"shadow-root",a.attributes&&g(a.attributes,function(a){b+=" "+a.name+(a.value?'="'+a.value+'"':"")}),b+="&gt;</tag>"};shadowize=function(){var a=Number(this.attributes.idx.value),b=k[a];b?f(b.webkitShadowRoot||b.shadowRoot,b):(console.log("bad shadowize node"),console.dir(this))},a.output=j}(window.Inspector),function(){var a=document.createElement("style");a.textContent="body {transition: opacity ease-in 0.2s; } \nbody[unresolved] {opacity: 0; display: block; overflow: hidden; } \n";var b=document.querySelector("head");b.insertBefore(a,b.firstChild)}(Platform),function(a){function b(a,b){return b=b||[],b.map||(b=[b]),a.apply(this,b.map(d))}function c(a,c,d){var e;switch(arguments.length){case 0:return;case 1:e=null;break;case 2:e=c.apply(this);break;default:e=b(d,c)}f[a]=e}function d(a){return f[a]}function e(a,c){HTMLImports.whenImportsReady(function(){b(c,a)})}var f={};a.marshal=d,a.module=c,a.using=e}(window),function(a){function b(a){f.textContent=d++,e.push(a)}function c(){for(;e.length;)e.shift()()}var d=0,e=[],f=document.createTextNode("");new(window.MutationObserver||JsMutationObserver)(c).observe(f,{characterData:!0}),a.endOfMicrotask=b}(Platform),function(a){function b(a,b,d){return a.replace(d,function(a,d,e,f){var g=e.replace(/["']/g,"");return g=c(b,g),d+"'"+g+"'"+f})}function c(a,b){var c=new URL(b,a);return d(c.href)}function d(a){var b=document.location,c=new URL(a,b);return c.host===b.host&&c.port===b.port&&c.protocol===b.protocol?e(b.pathname,c.pathname):a}function e(a,b){for(var c=a.split("/"),d=b.split("/");c.length&&c[0]===d[0];)c.shift(),d.shift();for(var e=0,f=c.length-1;f>e;e++)d.unshift("..");return d.join("/")}var f={resolveDom:function(a,b){b=b||a.ownerDocument.baseURI,this.resolveAttributes(a,b),this.resolveStyles(a,b);var c=a.querySelectorAll("template");if(c)for(var d,e=0,f=c.length;f>e&&(d=c[e]);e++)d.content&&this.resolveDom(d.content,b)},resolveTemplate:function(a){this.resolveDom(a.content,a.ownerDocument.baseURI)},resolveStyles:function(a,b){var c=a.querySelectorAll("style");if(c)for(var d,e=0,f=c.length;f>e&&(d=c[e]);e++)this.resolveStyle(d,b)},resolveStyle:function(a,b){b=b||a.ownerDocument.baseURI,a.textContent=this.resolveCssText(a.textContent,b)},resolveCssText:function(a,c){return a=b(a,c,g),b(a,c,h)},resolveAttributes:function(a,b){a.hasAttributes&&a.hasAttributes()&&this.resolveElementAttributes(a,b);var c=a&&a.querySelectorAll(j);if(c)for(var d,e=0,f=c.length;f>e&&(d=c[e]);e++)this.resolveElementAttributes(d,b)},resolveElementAttributes:function(a,d){d=d||a.ownerDocument.baseURI,i.forEach(function(e){var f,h=a.attributes[e],i=h&&h.value;i&&i.search(k)<0&&(f="style"===e?b(i,d,g):c(d,i),h.value=f)})}},g=/(url\()([^)]*)(\))/g,h=/(@import[\s]+(?!url\())([^;]*)(;)/g,i=["href","src","action","style"],j="["+i.join("],[")+"]",k="{{.*}}";a.urlResolver=f}(Platform),function(a){function b(a){u.push(a),t||(t=!0,q(d))}function c(a){return window.ShadowDOMPolyfill&&window.ShadowDOMPolyfill.wrapIfNeeded(a)||a}function d(){t=!1;var a=u;u=[],a.sort(function(a,b){return a.uid_-b.uid_});var b=!1;a.forEach(function(a){var c=a.takeRecords();e(a),c.length&&(a.callback_(c,a),b=!0)}),b&&d()}function e(a){a.nodes_.forEach(function(b){var c=p.get(b);c&&c.forEach(function(b){b.observer===a&&b.removeTransientObservers()})})}function f(a,b){for(var c=a;c;c=c.parentNode){var d=p.get(c);if(d)for(var e=0;e<d.length;e++){var f=d[e],g=f.options;if(c===a||g.subtree){var h=b(g);h&&f.enqueue(h)}}}}function g(a){this.callback_=a,this.nodes_=[],this.records_=[],this.uid_=++v}function h(a,b){this.type=a,this.target=b,this.addedNodes=[],this.removedNodes=[],this.previousSibling=null,this.nextSibling=null,this.attributeName=null,this.attributeNamespace=null,this.oldValue=null}function i(a){var b=new h(a.type,a.target);return b.addedNodes=a.addedNodes.slice(),b.removedNodes=a.removedNodes.slice(),b.previousSibling=a.previousSibling,b.nextSibling=a.nextSibling,b.attributeName=a.attributeName,b.attributeNamespace=a.attributeNamespace,b.oldValue=a.oldValue,b}function j(a,b){return w=new h(a,b)}function k(a){return x?x:(x=i(w),x.oldValue=a,x)}function l(){w=x=void 0}function m(a){return a===x||a===w}function n(a,b){return a===b?a:x&&m(a)?x:null}function o(a,b,c){this.observer=a,this.target=b,this.options=c,this.transientObservedNodes=[]}var p=new WeakMap,q=window.msSetImmediate;if(!q){var r=[],s=String(Math.random());window.addEventListener("message",function(a){if(a.data===s){var b=r;r=[],b.forEach(function(a){a()})}}),q=function(a){r.push(a),window.postMessage(s,"*")}}var t=!1,u=[],v=0;g.prototype={observe:function(a,b){if(a=c(a),!b.childList&&!b.attributes&&!b.characterData||b.attributeOldValue&&!b.attributes||b.attributeFilter&&b.attributeFilter.length&&!b.attributes||b.characterDataOldValue&&!b.characterData)throw new SyntaxError;var d=p.get(a);d||p.set(a,d=[]);for(var e,f=0;f<d.length;f++)if(d[f].observer===this){e=d[f],e.removeListeners(),e.options=b;break}e||(e=new o(this,a,b),d.push(e),this.nodes_.push(a)),e.addListeners()},disconnect:function(){this.nodes_.forEach(function(a){for(var b=p.get(a),c=0;c<b.length;c++){var d=b[c];if(d.observer===this){d.removeListeners(),b.splice(c,1);break}}},this),this.records_=[]},takeRecords:function(){var a=this.records_;return this.records_=[],a}};var w,x;o.prototype={enqueue:function(a){var c=this.observer.records_,d=c.length;if(c.length>0){var e=c[d-1],f=n(e,a);if(f)return void(c[d-1]=f)}else b(this.observer);c[d]=a},addListeners:function(){this.addListeners_(this.target)},addListeners_:function(a){var b=this.options;b.attributes&&a.addEventListener("DOMAttrModified",this,!0),b.characterData&&a.addEventListener("DOMCharacterDataModified",this,!0),b.childList&&a.addEventListener("DOMNodeInserted",this,!0),(b.childList||b.subtree)&&a.addEventListener("DOMNodeRemoved",this,!0)},removeListeners:function(){this.removeListeners_(this.target)},removeListeners_:function(a){var b=this.options;b.attributes&&a.removeEventListener("DOMAttrModified",this,!0),b.characterData&&a.removeEventListener("DOMCharacterDataModified",this,!0),b.childList&&a.removeEventListener("DOMNodeInserted",this,!0),(b.childList||b.subtree)&&a.removeEventListener("DOMNodeRemoved",this,!0)},addTransientObserver:function(a){if(a!==this.target){this.addListeners_(a),this.transientObservedNodes.push(a);var b=p.get(a);b||p.set(a,b=[]),b.push(this)}},removeTransientObservers:function(){var a=this.transientObservedNodes;this.transientObservedNodes=[],a.forEach(function(a){this.removeListeners_(a);for(var b=p.get(a),c=0;c<b.length;c++)if(b[c]===this){b.splice(c,1);break}},this)},handleEvent:function(a){switch(a.stopImmediatePropagation(),a.type){case"DOMAttrModified":var b=a.attrName,c=a.relatedNode.namespaceURI,d=a.target,e=new j("attributes",d);e.attributeName=b,e.attributeNamespace=c;var g=a.attrChange===MutationEvent.ADDITION?null:a.prevValue;f(d,function(a){return!a.attributes||a.attributeFilter&&a.attributeFilter.length&&-1===a.attributeFilter.indexOf(b)&&-1===a.attributeFilter.indexOf(c)?void 0:a.attributeOldValue?k(g):e});break;case"DOMCharacterDataModified":var d=a.target,e=j("characterData",d),g=a.prevValue;f(d,function(a){return a.characterData?a.characterDataOldValue?k(g):e:void 0});break;case"DOMNodeRemoved":this.addTransientObserver(a.target);case"DOMNodeInserted":var h,i,d=a.relatedNode,m=a.target;"DOMNodeInserted"===a.type?(h=[m],i=[]):(h=[],i=[m]);var n=m.previousSibling,o=m.nextSibling,e=j("childList",d);e.addedNodes=h,e.removedNodes=i,e.previousSibling=n,e.nextSibling=o,f(d,function(a){return a.childList?e:void 0})}l()}},a.JsMutationObserver=g,a.MutationObserver||(a.MutationObserver=g)}(this),window.HTMLImports=window.HTMLImports||{flags:{}},function(a){var b=(a.path,a.xhr),c=a.flags,d=function(a,b){this.cache={},this.onload=a,this.oncomplete=b,this.inflight=0,this.pending={}};d.prototype={addNodes:function(a){this.inflight+=a.length;for(var b,c=0,d=a.length;d>c&&(b=a[c]);c++)this.require(b);this.checkDone()},addNode:function(a){this.inflight++,this.require(a),this.checkDone()},require:function(a){var b=a.src||a.href;a.__nodeUrl=b,this.dedupe(b,a)||this.fetch(b,a)},dedupe:function(a,b){if(this.pending[a])return this.pending[a].push(b),!0;return this.cache[a]?(this.onload(a,b,this.cache[a]),this.tail(),!0):(this.pending[a]=[b],!1)},fetch:function(a,d){if(c.load&&console.log("fetch",a,d),a.match(/^data:/)){var e=a.split(","),f=e[0],g=e[1];g=f.indexOf(";base64")>-1?atob(g):decodeURIComponent(g),setTimeout(function(){this.receive(a,d,null,g)}.bind(this),0)}else{var h=function(b,c){this.receive(a,d,b,c)}.bind(this);b.load(a,h)}},receive:function(a,b,c,d){this.cache[a]=d;for(var e,f=this.pending[a],g=0,h=f.length;h>g&&(e=f[g]);g++)this.onload(a,e,d),this.tail();this.pending[a]=null},tail:function(){--this.inflight,this.checkDone()},checkDone:function(){this.inflight||this.oncomplete()}},b=b||{async:!0,ok:function(a){return a.status>=200&&a.status<300||304===a.status||0===a.status},load:function(c,d,e){var f=new XMLHttpRequest;return(a.flags.debug||a.flags.bust)&&(c+="?"+Math.random()),f.open("GET",c,b.async),f.addEventListener("readystatechange",function(){4===f.readyState&&d.call(e,!b.ok(f)&&f,f.response||f.responseText,c)}),f.send(),f},loadDocument:function(a,b,c){this.load(a,b,c).responseType="document"}},a.xhr=b,a.Loader=d}(window.HTMLImports),function(a){function b(a){return"link"===a.localName&&a.rel===g}function c(a){var b,c=d(a);try{b=btoa(c)}catch(e){b=btoa(unescape(encodeURIComponent(c))),console.warn("Script contained non-latin characters that were forced to latin. Some characters may be wrong.",a)}return"data:text/javascript;base64,"+b}function d(a){return a.textContent+e(a)}function e(a){var b=a.__nodeUrl;if(!b){b=a.ownerDocument.baseURI;var c="["+Math.floor(1e3*(Math.random()+1))+"]",d=a.textContent.match(/Polymer\(['"]([^'"]*)/);c=d&&d[1]||c,b+="/"+c+".js"}return"\n//# sourceURL="+b+"\n"}function f(a){var b=a.ownerDocument.createElement("style");return b.textContent=a.textContent,n.resolveUrlsInStyle(b),b}var g="import",h=a.flags,i=/Trident/.test(navigator.userAgent),j=window.ShadowDOMPolyfill?window.ShadowDOMPolyfill.wrapIfNeeded(document):document,k={documentSelectors:"link[rel="+g+"]",importsSelectors:["link[rel="+g+"]","link[rel=stylesheet]","style","script:not([type])",'script[type="text/javascript"]'].join(","),map:{link:"parseLink",script:"parseScript",style:"parseStyle"},parseNext:function(){var a=this.nextToParse();a&&this.parse(a)},parse:function(a){if(this.isParsed(a))return void(h.parse&&console.log("[%s] is already parsed",a.localName));var b=this[this.map[a.localName]];b&&(this.markParsing(a),b.call(this,a))},markParsing:function(a){h.parse&&console.log("parsing",a),this.parsingElement=a},markParsingComplete:function(a){a.__importParsed=!0,a.__importElement&&(a.__importElement.__importParsed=!0),this.parsingElement=null,h.parse&&console.log("completed",a),this.parseNext()},parseImport:function(a){if(a.import.__importParsed=!0,HTMLImports.__importsParsingHook&&HTMLImports.__importsParsingHook(a),a.dispatchEvent(a.__resource?new CustomEvent("load",{bubbles:!1}):new CustomEvent("error",{bubbles:!1})),a.__pending)for(var b;a.__pending.length;)b=a.__pending.shift(),b&&b({target:a});this.markParsingComplete(a)},parseLink:function(a){b(a)?this.parseImport(a):(a.href=a.href,this.parseGeneric(a))},parseStyle:function(a){var b=a;a=f(a),a.__importElement=b,this.parseGeneric(a)},parseGeneric:function(a){this.trackElement(a),document.head.appendChild(a)},trackElement:function(a,b){var c=this,d=function(d){b&&b(d),c.markParsingComplete(a)};if(a.addEventListener("load",d),a.addEventListener("error",d),i&&"style"===a.localName){var e=!1;if(-1==a.textContent.indexOf("@import"))e=!0;else if(a.sheet){e=!0;for(var f,g=a.sheet.cssRules,h=g?g.length:0,j=0;h>j&&(f=g[j]);j++)f.type===CSSRule.IMPORT_RULE&&(e=e&&Boolean(f.styleSheet))}e&&a.dispatchEvent(new CustomEvent("load",{bubbles:!1}))}},parseScript:function(b){var d=document.createElement("script");d.__importElement=b,d.src=b.src?b.src:c(b),a.currentScript=b,this.trackElement(d,function(){d.parentNode.removeChild(d),a.currentScript=null}),document.head.appendChild(d)},nextToParse:function(){return!this.parsingElement&&this.nextToParseInDoc(j)},nextToParseInDoc:function(a,c){for(var d,e=a.querySelectorAll(this.parseSelectorsForNode(a)),f=0,g=e.length;g>f&&(d=e[f]);f++)if(!this.isParsed(d))return this.hasResource(d)?b(d)?this.nextToParseInDoc(d.import,d):d:void 0;return c},parseSelectorsForNode:function(a){var b=a.ownerDocument||a;return b===j?this.documentSelectors:this.importsSelectors},isParsed:function(a){return a.__importParsed},hasResource:function(a){return b(a)&&!a.import?!1:!0}},l=/(url\()([^)]*)(\))/g,m=/(@import[\s]+(?!url\())([^;]*)(;)/g,n={resolveUrlsInStyle:function(a){var b=a.ownerDocument,c=b.createElement("a");return a.textContent=this.resolveUrlsInCssText(a.textContent,c),a},resolveUrlsInCssText:function(a,b){var c=this.replaceUrls(a,b,l);return c=this.replaceUrls(c,b,m)},replaceUrls:function(a,b,c){return a.replace(c,function(a,c,d,e){var f=d.replace(/["']/g,"");return b.href=f,f=b.href,c+"'"+f+"'"+e})}};a.parser=k,a.path=n,a.isIE=i}(HTMLImports),function(a){function b(a){return c(a,m)}function c(a,b){return"link"===a.localName&&a.getAttribute("rel")===b}function d(a,b){var c=a;c instanceof Document||(c=document.implementation.createHTMLDocument(m)),c._URL=b;var d=c.createElement("base");d.setAttribute("href",b),c.baseURI||(c.baseURI=b);var e=c.createElement("meta");return e.setAttribute("charset","utf-8"),c.head.appendChild(e),c.head.appendChild(d),a instanceof Document||(c.body.innerHTML=a),window.HTMLTemplateElement&&HTMLTemplateElement.bootstrap&&HTMLTemplateElement.bootstrap(c),c}function e(a,b){b=b||n,g(function(){h(a,b)},b)}function f(a){return"complete"===a.readyState||a.readyState===u}function g(a,b){if(f(b))a&&a();else{var c=function(){("complete"===b.readyState||b.readyState===u)&&(b.removeEventListener(v,c),g(a,b))};b.addEventListener(v,c)}}function h(a,b){function c(){f==g&&requestAnimationFrame(a)}function d(){f++,c()}var e=b.querySelectorAll("link[rel=import]"),f=0,g=e.length;if(g)for(var h,j=0;g>j&&(h=e[j]);j++)i(h)?d.call(h):(h.addEventListener("load",d),h.addEventListener("error",d));else c()}function i(a){return k?a.import&&"loading"!==a.import.readyState:a.__importParsed}var j="import"in document.createElement("link"),k=j,l=a.flags,m="import",n=window.ShadowDOMPolyfill?ShadowDOMPolyfill.wrapIfNeeded(document):document;if(k)var o={};else var p=(a.xhr,a.Loader),q=a.parser,o={documents:{},documentPreloadSelectors:"link[rel="+m+"]",importsPreloadSelectors:["link[rel="+m+"]"].join(","),loadNode:function(a){r.addNode(a)},loadSubtree:function(a){var b=this.marshalNodes(a);r.addNodes(b)},marshalNodes:function(a){return a.querySelectorAll(this.loadSelectorsForNode(a))},loadSelectorsForNode:function(a){var b=a.ownerDocument||a;return b===n?this.documentPreloadSelectors:this.importsPreloadSelectors},loaded:function(a,c,e){if(l.load&&console.log("loaded",a,c),c.__resource=e,b(c)){var f=this.documents[a];f||(f=d(e,a),f.__importLink=c,this.bootDocument(f),this.documents[a]=f),c.import=f}q.parseNext()},bootDocument:function(a){this.loadSubtree(a),this.observe(a),q.parseNext()},loadedAll:function(){q.parseNext()}},r=new p(o.loaded.bind(o),o.loadedAll.bind(o));var s={get:function(){return HTMLImports.currentScript||document.currentScript},configurable:!0};if(Object.defineProperty(document,"_currentScript",s),Object.defineProperty(n,"_currentScript",s),!document.baseURI){var t={get:function(){return window.location.href},configurable:!0};Object.defineProperty(document,"baseURI",t),Object.defineProperty(n,"baseURI",t)}var u=HTMLImports.isIE?"complete":"interactive",v="readystatechange";a.hasNative=j,a.useNative=k,a.importer=o,a.whenImportsReady=e,a.IMPORT_LINK_TYPE=m,a.isImportLoaded=i,a.importLoader=r}(window.HTMLImports),function(a){function b(a){for(var b,d=0,e=a.length;e>d&&(b=a[d]);d++)"childList"===b.type&&b.addedNodes.length&&c(b.addedNodes)}function c(a){for(var b,e=0,g=a.length;g>e&&(b=a[e]);e++)d(b)&&f.loadNode(b),b.children&&b.children.length&&c(b.children)}function d(a){return 1===a.nodeType&&g.call(a,f.loadSelectorsForNode(a))}function e(a){h.observe(a,{childList:!0,subtree:!0})}var f=(a.IMPORT_LINK_TYPE,a.importer),g=HTMLElement.prototype.matches||HTMLElement.prototype.matchesSelector||HTMLElement.prototype.webkitMatchesSelector||HTMLElement.prototype.mozMatchesSelector||HTMLElement.prototype.msMatchesSelector,h=new MutationObserver(b);a.observe=e,f.observe=e}(HTMLImports),function(){function a(){HTMLImports.importer.bootDocument(b)}"function"!=typeof window.CustomEvent&&(window.CustomEvent=function(a,b){var c=document.createEvent("HTMLEvents");return c.initEvent(a,b.bubbles===!1?!1:!0,b.cancelable===!1?!1:!0,b.detail),c});var b=window.ShadowDOMPolyfill?window.ShadowDOMPolyfill.wrapIfNeeded(document):document;HTMLImports.whenImportsReady(function(){HTMLImports.ready=!0,HTMLImports.readyTime=(new Date).getTime(),b.dispatchEvent(new CustomEvent("HTMLImportsLoaded",{bubbles:!0}))}),HTMLImports.useNative||("complete"===document.readyState||"interactive"===document.readyState&&!window.attachEvent?a():document.addEventListener("DOMContentLoaded",a))}(),window.CustomElements=window.CustomElements||{flags:{}},function(a){function b(a,c,d){var e=a.firstElementChild;if(!e)for(e=a.firstChild;e&&e.nodeType!==Node.ELEMENT_NODE;)e=e.nextSibling;for(;e;)c(e,d)!==!0&&b(e,c,d),e=e.nextElementSibling;return null}function c(a,b){for(var c=a.shadowRoot;c;)d(c,b),c=c.olderShadowRoot}function d(a,d){b(a,function(a){return d(a)?!0:void c(a,d)}),c(a,d)}function e(a){return h(a)?(i(a),!0):void l(a)}function f(a){d(a,function(a){return e(a)?!0:void 0})}function g(a){return e(a)||f(a)}function h(b){if(!b.__upgraded__&&b.nodeType===Node.ELEMENT_NODE){var c=b.getAttribute("is")||b.localName,d=a.registry[c];if(d)return A.dom&&console.group("upgrade:",b.localName),a.upgrade(b),A.dom&&console.groupEnd(),!0}}function i(a){l(a),r(a)&&d(a,function(a){l(a)})}function j(a){if(E.push(a),!D){D=!0;var b=window.Platform&&window.Platform.endOfMicrotask||setTimeout;b(k)}}function k(){D=!1;for(var a,b=E,c=0,d=b.length;d>c&&(a=b[c]);c++)a();E=[]}function l(a){C?j(function(){m(a)}):m(a)}function m(a){(a.attachedCallback||a.detachedCallback||a.__upgraded__&&A.dom)&&(A.dom&&console.group("inserted:",a.localName),r(a)&&(a.__inserted=(a.__inserted||0)+1,a.__inserted<1&&(a.__inserted=1),a.__inserted>1?A.dom&&console.warn("inserted:",a.localName,"insert/remove count:",a.__inserted):a.attachedCallback&&(A.dom&&console.log("inserted:",a.localName),a.attachedCallback())),A.dom&&console.groupEnd())}function n(a){o(a),d(a,function(a){o(a)})}function o(a){C?j(function(){p(a)}):p(a)}function p(a){(a.attachedCallback||a.detachedCallback||a.__upgraded__&&A.dom)&&(A.dom&&console.group("removed:",a.localName),r(a)||(a.__inserted=(a.__inserted||0)-1,a.__inserted>0&&(a.__inserted=0),a.__inserted<0?A.dom&&console.warn("removed:",a.localName,"insert/remove count:",a.__inserted):a.detachedCallback&&a.detachedCallback()),A.dom&&console.groupEnd())}function q(a){return window.ShadowDOMPolyfill?ShadowDOMPolyfill.wrapIfNeeded(a):a}function r(a){for(var b=a,c=q(document);b;){if(b==c)return!0;b=b.parentNode||b.host}}function s(a){if(a.shadowRoot&&!a.shadowRoot.__watched){A.dom&&console.log("watching shadow-root for: ",a.localName);for(var b=a.shadowRoot;b;)t(b),b=b.olderShadowRoot}}function t(a){a.__watched||(w(a),a.__watched=!0)}function u(a){if(A.dom){var b=a[0];if(b&&"childList"===b.type&&b.addedNodes&&b.addedNodes){for(var c=b.addedNodes[0];c&&c!==document&&!c.host;)c=c.parentNode;var d=c&&(c.URL||c._URL||c.host&&c.host.localName)||"";d=d.split("/?").shift().split("/").pop()}console.group("mutations (%d) [%s]",a.length,d||"")}a.forEach(function(a){"childList"===a.type&&(G(a.addedNodes,function(a){a.localName&&g(a)}),G(a.removedNodes,function(a){a.localName&&n(a)}))}),A.dom&&console.groupEnd()}function v(){u(F.takeRecords()),k()}function w(a){F.observe(a,{childList:!0,subtree:!0})}function x(a){w(a)}function y(a){A.dom&&console.group("upgradeDocument: ",a.baseURI.split("/").pop()),g(a),A.dom&&console.groupEnd()}function z(a){a=q(a);for(var b,c=a.querySelectorAll("link[rel="+B+"]"),d=0,e=c.length;e>d&&(b=c[d]);d++)b.import&&b.import.__parsed&&z(b.import);y(a)}var A=window.logFlags||{},B=window.HTMLImports?HTMLImports.IMPORT_LINK_TYPE:"none",C=!window.MutationObserver||window.MutationObserver===window.JsMutationObserver;a.hasPolyfillMutations=C;var D=!1,E=[],F=new MutationObserver(u),G=Array.prototype.forEach.call.bind(Array.prototype.forEach);a.IMPORT_LINK_TYPE=B,a.watchShadow=s,a.upgradeDocumentTree=z,a.upgradeAll=g,a.upgradeSubtree=f,a.insertedNode=i,a.observeDocument=x,a.upgradeDocument=y,a.takeRecords=v}(window.CustomElements),function(a){function b(b,g){var h=g||{};if(!b)throw new Error("document.registerElement: first argument `name` must not be empty");if(b.indexOf("-")<0)throw new Error("document.registerElement: first argument ('name') must contain a dash ('-'). Argument provided was '"+String(b)+"'.");if(c(b))throw new Error("Failed to execute 'registerElement' on 'Document': Registration failed for type '"+String(b)+"'. The type name is invalid.");if(n(b))throw new Error("DuplicateDefinitionError: a type with name '"+String(b)+"' is already registered");if(!h.prototype)throw new Error("Options missing required prototype property");return h.__name=b.toLowerCase(),h.lifecycle=h.lifecycle||{},h.ancestry=d(h.extends),e(h),f(h),l(h.prototype),o(h.__name,h),h.ctor=p(h),h.ctor.prototype=h.prototype,h.prototype.constructor=h.ctor,a.ready&&a.upgradeDocumentTree(document),h.ctor}function c(a){for(var b=0;b<y.length;b++)if(a===y[b])return!0}function d(a){var b=n(a);return b?d(b.extends).concat([b]):[]}function e(a){for(var b,c=a.extends,d=0;b=a.ancestry[d];d++)c=b.is&&b.tag;a.tag=c||a.__name,c&&(a.is=a.__name)}function f(a){if(!Object.__proto__){var b=HTMLElement.prototype;if(a.is){var c=document.createElement(a.tag);b=Object.getPrototypeOf(c)}for(var d,e=a.prototype;e&&e!==b;){var d=Object.getPrototypeOf(e);e.__proto__=d,e=d}}a.native=b}function g(a){return h(B(a.tag),a)}function h(b,c){return c.is&&b.setAttribute("is",c.is),b.removeAttribute("unresolved"),i(b,c),b.__upgraded__=!0,k(b),a.insertedNode(b),a.upgradeSubtree(b),b}function i(a,b){Object.__proto__?a.__proto__=b.prototype:(j(a,b.prototype,b.native),a.__proto__=b.prototype)}function j(a,b,c){for(var d={},e=b;e!==c&&e!==HTMLElement.prototype;){for(var f,g=Object.getOwnPropertyNames(e),h=0;f=g[h];h++)d[f]||(Object.defineProperty(a,f,Object.getOwnPropertyDescriptor(e,f)),d[f]=1);e=Object.getPrototypeOf(e)}}function k(a){a.createdCallback&&a.createdCallback()}function l(a){if(!a.setAttribute._polyfilled){var b=a.setAttribute;a.setAttribute=function(a,c){m.call(this,a,c,b)};var c=a.removeAttribute;a.removeAttribute=function(a){m.call(this,a,null,c)},a.setAttribute._polyfilled=!0}}function m(a,b,c){var d=this.getAttribute(a);c.apply(this,arguments);var e=this.getAttribute(a);this.attributeChangedCallback&&e!==d&&this.attributeChangedCallback(a,d,e)}function n(a){return a?z[a.toLowerCase()]:void 0}function o(a,b){z[a]=b}function p(a){return function(){return g(a)}}function q(a,b,c){return a===A?r(b,c):C(a,b)}function r(a,b){var c=n(b||a);if(c){if(a==c.tag&&b==c.is)return new c.ctor;if(!b&&!c.is)return new c.ctor}if(b){var d=r(a);return d.setAttribute("is",b),d}var d=B(a);return a.indexOf("-")>=0&&i(d,HTMLElement),d}function s(a){if(!a.__upgraded__&&a.nodeType===Node.ELEMENT_NODE){var b=a.getAttribute("is"),c=n(b||a.localName);if(c){if(b&&c.tag==a.localName)return h(a,c);if(!b&&!c.extends)return h(a,c)}}}function t(b){var c=D.call(this,b);return a.upgradeAll(c),c}a||(a=window.CustomElements={flags:{}});var u=a.flags,v=Boolean(document.registerElement),w=!u.register&&v&&!window.ShadowDOMPolyfill;if(w){var x=function(){};a.registry={},a.upgradeElement=x,a.watchShadow=x,a.upgrade=x,a.upgradeAll=x,a.upgradeSubtree=x,a.observeDocument=x,a.upgradeDocument=x,a.upgradeDocumentTree=x,a.takeRecords=x,a.reservedTagList=[]}else{var y=["annotation-xml","color-profile","font-face","font-face-src","font-face-uri","font-face-format","font-face-name","missing-glyph"],z={},A="http://www.w3.org/1999/xhtml",B=document.createElement.bind(document),C=document.createElementNS.bind(document),D=Node.prototype.cloneNode;document.registerElement=b,document.createElement=r,document.createElementNS=q,Node.prototype.cloneNode=t,a.registry=z,a.upgrade=s}var E;E=Object.__proto__||w?function(a,b){return a instanceof b}:function(a,b){for(var c=a;c;){if(c===b.prototype)return!0;c=c.__proto__}return!1},a.instanceof=E,a.reservedTagList=y,document.register=document.registerElement,a.hasNative=v,a.useNative=w}(window.CustomElements),function(a){function b(a){return"link"===a.localName&&a.getAttribute("rel")===c}var c=a.IMPORT_LINK_TYPE,d={selectors:["link[rel="+c+"]"],map:{link:"parseLink"},parse:function(a){if(!a.__parsed){a.__parsed=!0;var b=a.querySelectorAll(d.selectors);e(b,function(a){d[d.map[a.localName]](a)}),CustomElements.upgradeDocument(a),CustomElements.observeDocument(a)}},parseLink:function(a){b(a)&&this.parseImport(a)},parseImport:function(a){a.import&&d.parse(a.import)}},e=Array.prototype.forEach.call.bind(Array.prototype.forEach);a.parser=d,a.IMPORT_LINK_TYPE=c}(window.CustomElements),function(a){function b(){CustomElements.parser.parse(document),CustomElements.upgradeDocument(document);var a=window.Platform&&Platform.endOfMicrotask?Platform.endOfMicrotask:setTimeout;a(function(){CustomElements.ready=!0,CustomElements.readyTime=Date.now(),window.HTMLImports&&(CustomElements.elapsed=CustomElements.readyTime-HTMLImports.readyTime),document.dispatchEvent(new CustomEvent("WebComponentsReady",{bubbles:!0})),window.HTMLImports&&(HTMLImports.__importsParsingHook=function(a){CustomElements.parser.parse(a.import)})})}if("function"!=typeof window.CustomEvent&&(window.CustomEvent=function(a){var b=document.createEvent("HTMLEvents");return b.initEvent(a,!0,!0),b}),"complete"===document.readyState||a.flags.eager)b();
+else if("interactive"!==document.readyState||window.attachEvent||window.HTMLImports&&!window.HTMLImports.ready){var c=window.HTMLImports&&!HTMLImports.ready?"HTMLImportsLoaded":"DOMContentLoaded";window.addEventListener(c,b)}else b()}(window.CustomElements),function(){if(window.ShadowDOMPolyfill){var a=["upgradeAll","upgradeSubtree","observeDocument","upgradeDocument"],b={};a.forEach(function(a){b[a]=CustomElements[a]}),a.forEach(function(a){CustomElements[a]=function(c){return b[a](wrap(c))}})}}(),function(a){function b(a){this.regex=a}var c=a.endOfMicrotask;b.prototype={extractUrls:function(a,b){for(var c,d,e=[];c=this.regex.exec(a);)d=new URL(c[1],b),e.push({matched:c[0],url:d.href});return e},process:function(a,b,c){var d=this.extractUrls(a,b);this.fetch(d,{},c)},fetch:function(a,b,d){var e=a.length;if(!e)return d(b);for(var f,g,h,i=function(){0===--e&&d(b)},j=function(a,c){var d=c.match,e=d.url;if(a)return b[e]="",i();var f=c.response||c.responseText;b[e]=f,this.fetch(this.extractUrls(f,e),b,i)},k=0;e>k;k++)f=a[k],h=f.url,b[h]?c(i):(g=this.xhr(h,j,this),g.match=f,b[h]=g)},xhr:function(a,b,c){var d=new XMLHttpRequest;return d.open("GET",a,!0),d.send(),d.onload=function(){b.call(c,null,d)},d.onerror=function(){b.call(c,null,d)},d}},a.Loader=b}(window.Platform),function(a){function b(){this.loader=new d(this.regex)}var c=a.urlResolver,d=a.Loader;b.prototype={regex:/@import\s+(?:url)?["'\(]*([^'"\)]*)['"\)]*;/g,resolve:function(a,b,c){var d=function(d){c(this.flatten(a,b,d))}.bind(this);this.loader.process(a,b,d)},resolveNode:function(a,b){var c=a.textContent,d=a.ownerDocument.baseURI,e=function(c){a.textContent=c,b(a)};this.resolve(c,d,e)},flatten:function(a,b,d){for(var e,f,g,h=this.loader.extractUrls(a,b),i=0;i<h.length;i++)e=h[i],f=e.url,g=c.resolveCssText(d[f],f),g=this.flatten(g,b,d),a=a.replace(e.matched,g);return a},loadStyles:function(a,b){function c(){e++,e===f&&b&&b()}for(var d,e=0,f=a.length,g=0;f>g&&(d=a[g]);g++)this.resolveNode(d,c)}};var e=new b;a.styleResolver=e}(window.Platform),function(){"use strict";function a(a){for(;a.parentNode;)a=a.parentNode;return"function"==typeof a.getElementById?a:null}function b(a,b,c){var d=a.bindings_;return d||(d=a.bindings_={}),d[b]&&c[b].close(),d[b]=c}function c(a,b,c){return c}function d(a){return null==a?"":a}function e(a,b){a.data=d(b)}function f(a){return function(b){return e(a,b)}}function g(a,b,c,e){return c?void(e?a.setAttribute(b,""):a.removeAttribute(b)):void a.setAttribute(b,d(e))}function h(a,b,c){return function(d){g(a,b,c,d)}}function i(a){switch(a.type){case"checkbox":return u;case"radio":case"select-multiple":case"select-one":return"change";case"range":if(/Trident|MSIE/.test(navigator.userAgent))return"change";default:return"input"}}function j(a,b,c,e){a[b]=(e||d)(c)}function k(a,b,c){return function(d){return j(a,b,d,c)}}function l(){}function m(a,b,c,d){function e(){c.setValue(a[b]),c.discardChanges(),(d||l)(a),Platform.performMicrotaskCheckpoint()}var f=i(a);return a.addEventListener(f,e),{close:function(){a.removeEventListener(f,e),c.close()},observable_:c}}function n(a){return Boolean(a)}function o(b){if(b.form)return s(b.form.elements,function(a){return a!=b&&"INPUT"==a.tagName&&"radio"==a.type&&a.name==b.name});var c=a(b);if(!c)return[];var d=c.querySelectorAll('input[type="radio"][name="'+b.name+'"]');return s(d,function(a){return a!=b&&!a.form})}function p(a){"INPUT"===a.tagName&&"radio"===a.type&&o(a).forEach(function(a){var b=a.bindings_.checked;b&&b.observable_.setValue(!1)})}function q(a,b){var c,e,f,g=a.parentNode;g instanceof HTMLSelectElement&&g.bindings_&&g.bindings_.value&&(c=g,e=c.bindings_.value,f=c.value),a.value=d(b),c&&c.value!=f&&(e.observable_.setValue(c.value),e.observable_.discardChanges(),Platform.performMicrotaskCheckpoint())}function r(a){return function(b){q(a,b)}}var s=Array.prototype.filter.call.bind(Array.prototype.filter);Node.prototype.bind=function(a,b){console.error("Unhandled binding to Node: ",this,a,b)},Node.prototype.bindFinished=function(){};var t=c;Object.defineProperty(Platform,"enableBindingsReflection",{get:function(){return t===b},set:function(a){return t=a?b:c,a},configurable:!0}),Text.prototype.bind=function(a,b,c){if("textContent"!==a)return Node.prototype.bind.call(this,a,b,c);if(c)return e(this,b);var d=b;return e(this,d.open(f(this))),t(this,a,d)},Element.prototype.bind=function(a,b,c){var d="?"==a[a.length-1];if(d&&(this.removeAttribute(a),a=a.slice(0,-1)),c)return g(this,a,d,b);var e=b;return g(this,a,d,e.open(h(this,a,d))),t(this,a,e)};var u;!function(){var a=document.createElement("div"),b=a.appendChild(document.createElement("input"));b.setAttribute("type","checkbox");var c,d=0;b.addEventListener("click",function(){d++,c=c||"click"}),b.addEventListener("change",function(){d++,c=c||"change"});var e=document.createEvent("MouseEvent");e.initMouseEvent("click",!0,!0,window,0,0,0,0,0,!1,!1,!1,!1,0,null),b.dispatchEvent(e),u=1==d?"change":c}(),HTMLInputElement.prototype.bind=function(a,c,e){if("value"!==a&&"checked"!==a)return HTMLElement.prototype.bind.call(this,a,c,e);this.removeAttribute(a);var f="checked"==a?n:d,g="checked"==a?p:l;if(e)return j(this,a,c,f);var h=c,i=m(this,a,h,g);return j(this,a,h.open(k(this,a,f)),f),b(this,a,i)},HTMLTextAreaElement.prototype.bind=function(a,b,c){if("value"!==a)return HTMLElement.prototype.bind.call(this,a,b,c);if(this.removeAttribute("value"),c)return j(this,"value",b);var e=b,f=m(this,"value",e);return j(this,"value",e.open(k(this,"value",d))),t(this,a,f)},HTMLOptionElement.prototype.bind=function(a,b,c){if("value"!==a)return HTMLElement.prototype.bind.call(this,a,b,c);if(this.removeAttribute("value"),c)return q(this,b);var d=b,e=m(this,"value",d);return q(this,d.open(r(this))),t(this,a,e)},HTMLSelectElement.prototype.bind=function(a,c,d){if("selectedindex"===a&&(a="selectedIndex"),"selectedIndex"!==a&&"value"!==a)return HTMLElement.prototype.bind.call(this,a,c,d);if(this.removeAttribute(a),d)return j(this,a,c);var e=c,f=m(this,a,e);return j(this,a,e.open(k(this,a))),b(this,a,f)}}(this),function(a){"use strict";function b(a){if(!a)throw new Error("Assertion failed")}function c(a){for(var b;b=a.parentNode;)a=b;return a}function d(a,b){if(b){for(var d,e="#"+b;!d&&(a=c(a),a.protoContent_?d=a.protoContent_.querySelector(e):a.getElementById&&(d=a.getElementById(b)),!d&&a.templateCreator_);)a=a.templateCreator_;return d}}function e(a){return"template"==a.tagName&&"http://www.w3.org/2000/svg"==a.namespaceURI}function f(a){return"TEMPLATE"==a.tagName&&"http://www.w3.org/1999/xhtml"==a.namespaceURI}function g(a){return Boolean(L[a.tagName]&&a.hasAttribute("template"))}function h(a){return void 0===a.isTemplate_&&(a.isTemplate_="TEMPLATE"==a.tagName||g(a)),a.isTemplate_}function i(a,b){var c=a.querySelectorAll(N);h(a)&&b(a),G(c,b)}function j(a){function b(a){HTMLTemplateElement.decorate(a)||j(a.content)}i(a,b)}function k(a,b){Object.getOwnPropertyNames(b).forEach(function(c){Object.defineProperty(a,c,Object.getOwnPropertyDescriptor(b,c))})}function l(a){var b=a.ownerDocument;if(!b.defaultView)return b;var c=b.templateContentsOwner_;if(!c){for(c=b.implementation.createHTMLDocument("");c.lastChild;)c.removeChild(c.lastChild);b.templateContentsOwner_=c}return c}function m(a){if(!a.stagingDocument_){var b=a.ownerDocument;if(!b.stagingDocument_){b.stagingDocument_=b.implementation.createHTMLDocument(""),b.stagingDocument_.isStagingDocument=!0;var c=b.stagingDocument_.createElement("base");c.href=document.baseURI,b.stagingDocument_.head.appendChild(c),b.stagingDocument_.stagingDocument_=b.stagingDocument_}a.stagingDocument_=b.stagingDocument_}return a.stagingDocument_}function n(a){var b=a.ownerDocument.createElement("template");a.parentNode.insertBefore(b,a);for(var c=a.attributes,d=c.length;d-->0;){var e=c[d];K[e.name]&&("template"!==e.name&&b.setAttribute(e.name,e.value),a.removeAttribute(e.name))}return b}function o(a){var b=a.ownerDocument.createElement("template");a.parentNode.insertBefore(b,a);for(var c=a.attributes,d=c.length;d-->0;){var e=c[d];b.setAttribute(e.name,e.value),a.removeAttribute(e.name)}return a.parentNode.removeChild(a),b}function p(a,b,c){var d=a.content;if(c)return void d.appendChild(b);for(var e;e=b.firstChild;)d.appendChild(e)}function q(a){P?a.__proto__=HTMLTemplateElement.prototype:k(a,HTMLTemplateElement.prototype)}function r(a){a.setModelFn_||(a.setModelFn_=function(){a.setModelFnScheduled_=!1;var b=z(a,a.delegate_&&a.delegate_.prepareBinding);w(a,b,a.model_)}),a.setModelFnScheduled_||(a.setModelFnScheduled_=!0,Observer.runEOM_(a.setModelFn_))}function s(a,b,c,d){if(a&&a.length){for(var e,f=a.length,g=0,h=0,i=0,j=!0;f>h;){var g=a.indexOf("{{",h),k=a.indexOf("[[",h),l=!1,m="}}";if(k>=0&&(0>g||g>k)&&(g=k,l=!0,m="]]"),i=0>g?-1:a.indexOf(m,g+2),0>i){if(!e)return;e.push(a.slice(h));break}e=e||[],e.push(a.slice(h,g));var n=a.slice(g+2,i).trim();e.push(l),j=j&&l;var o=d&&d(n,b,c);e.push(null==o?Path.get(n):null),e.push(o),h=i+2}return h===f&&e.push(""),e.hasOnePath=5===e.length,e.isSimplePath=e.hasOnePath&&""==e[0]&&""==e[4],e.onlyOneTime=j,e.combinator=function(a){for(var b=e[0],c=1;c<e.length;c+=4){var d=e.hasOnePath?a:a[(c-1)/4];void 0!==d&&(b+=d),b+=e[c+3]}return b},e}}function t(a,b,c,d){if(b.hasOnePath){var e=b[3],f=e?e(d,c,!0):b[2].getValueFrom(d);return b.isSimplePath?f:b.combinator(f)}for(var g=[],h=1;h<b.length;h+=4){var e=b[h+2];g[(h-1)/4]=e?e(d,c):b[h+1].getValueFrom(d)}return b.combinator(g)}function u(a,b,c,d){var e=b[3],f=e?e(d,c,!1):new PathObserver(d,b[2]);return b.isSimplePath?f:new ObserverTransform(f,b.combinator)}function v(a,b,c,d){if(b.onlyOneTime)return t(a,b,c,d);if(b.hasOnePath)return u(a,b,c,d);for(var e=new CompoundObserver,f=1;f<b.length;f+=4){var g=b[f],h=b[f+2];if(h){var i=h(d,c,g);g?e.addPath(i):e.addObserver(i)}else{var j=b[f+1];g?e.addPath(j.getValueFrom(d)):e.addPath(d,j)}}return new ObserverTransform(e,b.combinator)}function w(a,b,c,d){for(var e=0;e<b.length;e+=2){var f=b[e],g=b[e+1],h=v(f,g,a,c),i=a.bind(f,h,g.onlyOneTime);i&&d&&d.push(i)}if(a.bindFinished(),b.isTemplate){a.model_=c;var j=a.processBindingDirectives_(b);d&&j&&d.push(j)}}function x(a,b,c){var d=a.getAttribute(b);return s(""==d?"{{}}":d,b,a,c)}function y(a,c){b(a);for(var d=[],e=0;e<a.attributes.length;e++){for(var f=a.attributes[e],g=f.name,i=f.value;"_"===g[0];)g=g.substring(1);if(!h(a)||g!==J&&g!==H&&g!==I){var j=s(i,g,a,c);j&&d.push(g,j)}}return h(a)&&(d.isTemplate=!0,d.if=x(a,J,c),d.bind=x(a,H,c),d.repeat=x(a,I,c),!d.if||d.bind||d.repeat||(d.bind=s("{{}}",H,a,c))),d}function z(a,b){if(a.nodeType===Node.ELEMENT_NODE)return y(a,b);if(a.nodeType===Node.TEXT_NODE){var c=s(a.data,"textContent",a,b);if(c)return["textContent",c]}return[]}function A(a,b,c,d,e,f,g){for(var h=b.appendChild(c.importNode(a,!1)),i=0,j=a.firstChild;j;j=j.nextSibling)A(j,h,c,d.children[i++],e,f,g);return d.isTemplate&&(HTMLTemplateElement.decorate(h,a),f&&h.setDelegate_(f)),w(h,d,e,g),h}function B(a,b){var c=z(a,b);c.children={};for(var d=0,e=a.firstChild;e;e=e.nextSibling)c.children[d++]=B(e,b);return c}function C(a){var b=a.id_;return b||(b=a.id_=S++),b}function D(a,b){var c=C(a);if(b){var d=b.bindingMaps[c];return d||(d=b.bindingMaps[c]=B(a,b.prepareBinding)||[]),d}var d=a.bindingMap_;return d||(d=a.bindingMap_=B(a,void 0)||[]),d}function E(a){this.closed=!1,this.templateElement_=a,this.instances=[],this.deps=void 0,this.iteratedValue=[],this.presentValue=void 0,this.arrayObserver=void 0}var F,G=Array.prototype.forEach.call.bind(Array.prototype.forEach);a.Map&&"function"==typeof a.Map.prototype.forEach?F=a.Map:(F=function(){this.keys=[],this.values=[]},F.prototype={set:function(a,b){var c=this.keys.indexOf(a);0>c?(this.keys.push(a),this.values.push(b)):this.values[c]=b},get:function(a){var b=this.keys.indexOf(a);if(!(0>b))return this.values[b]},"delete":function(a){var b=this.keys.indexOf(a);return 0>b?!1:(this.keys.splice(b,1),this.values.splice(b,1),!0)},forEach:function(a,b){for(var c=0;c<this.keys.length;c++)a.call(b||this,this.values[c],this.keys[c],this)}});"function"!=typeof document.contains&&(Document.prototype.contains=function(a){return a===this||a.parentNode===this?!0:this.documentElement.contains(a)});var H="bind",I="repeat",J="if",K={template:!0,repeat:!0,bind:!0,ref:!0},L={THEAD:!0,TBODY:!0,TFOOT:!0,TH:!0,TR:!0,TD:!0,COLGROUP:!0,COL:!0,CAPTION:!0,OPTION:!0,OPTGROUP:!0},M="undefined"!=typeof HTMLTemplateElement;M&&!function(){var a=document.createElement("template"),b=a.content.ownerDocument,c=b.appendChild(b.createElement("html")),d=c.appendChild(b.createElement("head")),e=b.createElement("base");e.href=document.baseURI,d.appendChild(e)}();var N="template, "+Object.keys(L).map(function(a){return a.toLowerCase()+"[template]"}).join(", ");document.addEventListener("DOMContentLoaded",function(){j(document),Platform.performMicrotaskCheckpoint()},!1),M||(a.HTMLTemplateElement=function(){throw TypeError("Illegal constructor")});var O,P="__proto__"in{};"function"==typeof MutationObserver&&(O=new MutationObserver(function(a){for(var b=0;b<a.length;b++)a[b].target.refChanged_()})),HTMLTemplateElement.decorate=function(a,c){if(a.templateIsDecorated_)return!1;var d=a;d.templateIsDecorated_=!0;var h=f(d)&&M,i=h,k=!h,m=!1;if(h||(g(d)?(b(!c),d=n(a),d.templateIsDecorated_=!0,h=M,m=!0):e(d)&&(d=o(a),d.templateIsDecorated_=!0,h=M)),!h){q(d);var r=l(d);d.content_=r.createDocumentFragment()}return c?d.instanceRef_=c:k?p(d,a,m):i&&j(d.content),!0},HTMLTemplateElement.bootstrap=j;var Q=a.HTMLUnknownElement||HTMLElement,R={get:function(){return this.content_},enumerable:!0,configurable:!0};M||(HTMLTemplateElement.prototype=Object.create(Q.prototype),Object.defineProperty(HTMLTemplateElement.prototype,"content",R)),k(HTMLTemplateElement.prototype,{bind:function(a,b,c){if("ref"!=a)return Element.prototype.bind.call(this,a,b,c);var d=this,e=c?b:b.open(function(a){d.setAttribute("ref",a),d.refChanged_()});return this.setAttribute("ref",e),this.refChanged_(),c?void 0:(this.bindings_?this.bindings_.ref=b:this.bindings_={ref:b},b)},processBindingDirectives_:function(a){return this.iterator_&&this.iterator_.closeDeps(),a.if||a.bind||a.repeat?(this.iterator_||(this.iterator_=new E(this)),this.iterator_.updateDependencies(a,this.model_),O&&O.observe(this,{attributes:!0,attributeFilter:["ref"]}),this.iterator_):void(this.iterator_&&(this.iterator_.close(),this.iterator_=void 0))},createInstance:function(a,b,c){b?c=this.newDelegate_(b):c||(c=this.delegate_),this.refContent_||(this.refContent_=this.ref_.content);var d=this.refContent_;if(null===d.firstChild)return T;var e=D(d,c),f=m(this),g=f.createDocumentFragment();g.templateCreator_=this,g.protoContent_=d,g.bindings_=[],g.terminator_=null;for(var h=g.templateInstance_={firstNode:null,lastNode:null,model:a},i=0,j=!1,k=d.firstChild;k;k=k.nextSibling){null===k.nextSibling&&(j=!0);var l=A(k,g,f,e.children[i++],a,c,g.bindings_);l.templateInstance_=h,j&&(g.terminator_=l)}return h.firstNode=g.firstChild,h.lastNode=g.lastChild,g.templateCreator_=void 0,g.protoContent_=void 0,g},get model(){return this.model_},set model(a){this.model_=a,r(this)},get bindingDelegate(){return this.delegate_&&this.delegate_.raw},refChanged_:function(){this.iterator_&&this.refContent_!==this.ref_.content&&(this.refContent_=void 0,this.iterator_.valueChanged(),this.iterator_.updateIteratedValue())},clear:function(){this.model_=void 0,this.delegate_=void 0,this.bindings_&&this.bindings_.ref&&this.bindings_.ref.close(),this.refContent_=void 0,this.iterator_&&(this.iterator_.valueChanged(),this.iterator_.close(),this.iterator_=void 0)},setDelegate_:function(a){this.delegate_=a,this.bindingMap_=void 0,this.iterator_&&(this.iterator_.instancePositionChangedFn_=void 0,this.iterator_.instanceModelFn_=void 0)},newDelegate_:function(a){function b(b){var c=a&&a[b];if("function"==typeof c)return function(){return c.apply(a,arguments)}}if(a)return{bindingMaps:{},raw:a,prepareBinding:b("prepareBinding"),prepareInstanceModel:b("prepareInstanceModel"),prepareInstancePositionChanged:b("prepareInstancePositionChanged")}},set bindingDelegate(a){if(this.delegate_)throw Error("Template must be cleared before a new bindingDelegate can be assigned");this.setDelegate_(this.newDelegate_(a))},get ref_(){var a=d(this,this.getAttribute("ref"));if(a||(a=this.instanceRef_),!a)return this;var b=a.ref_;return b?b:a}});var S=1;Object.defineProperty(Node.prototype,"templateInstance",{get:function(){var a=this.templateInstance_;return a?a:this.parentNode?this.parentNode.templateInstance:void 0}});var T=document.createDocumentFragment();T.bindings_=[],T.terminator_=null,E.prototype={closeDeps:function(){var a=this.deps;a&&(a.ifOneTime===!1&&a.ifValue.close(),a.oneTime===!1&&a.value.close())},updateDependencies:function(a,b){this.closeDeps();var c=this.deps={},d=this.templateElement_;if(a.if){if(c.hasIf=!0,c.ifOneTime=a.if.onlyOneTime,c.ifValue=v(J,a.if,d,b),c.ifOneTime&&!c.ifValue)return void this.updateIteratedValue();c.ifOneTime||c.ifValue.open(this.updateIteratedValue,this)}a.repeat?(c.repeat=!0,c.oneTime=a.repeat.onlyOneTime,c.value=v(I,a.repeat,d,b)):(c.repeat=!1,c.oneTime=a.bind.onlyOneTime,c.value=v(H,a.bind,d,b)),c.oneTime||c.value.open(this.updateIteratedValue,this),this.updateIteratedValue()},updateIteratedValue:function(){if(this.deps.hasIf){var a=this.deps.ifValue;if(this.deps.ifOneTime||(a=a.discardChanges()),!a)return void this.valueChanged()}var b=this.deps.value;this.deps.oneTime||(b=b.discardChanges()),this.deps.repeat||(b=[b]);var c=this.deps.repeat&&!this.deps.oneTime&&Array.isArray(b);this.valueChanged(b,c)},valueChanged:function(a,b){Array.isArray(a)||(a=[]),a!==this.iteratedValue&&(this.unobserve(),this.presentValue=a,b&&(this.arrayObserver=new ArrayObserver(this.presentValue),this.arrayObserver.open(this.handleSplices,this)),this.handleSplices(ArrayObserver.calculateSplices(this.presentValue,this.iteratedValue)))},getLastInstanceNode:function(a){if(-1==a)return this.templateElement_;var b=this.instances[a],c=b.terminator_;if(!c)return this.getLastInstanceNode(a-1);if(c.nodeType!==Node.ELEMENT_NODE||this.templateElement_===c)return c;var d=c.iterator_;return d?d.getLastTemplateNode():c},getLastTemplateNode:function(){return this.getLastInstanceNode(this.instances.length-1)},insertInstanceAt:function(a,b){var c=this.getLastInstanceNode(a-1),d=this.templateElement_.parentNode;this.instances.splice(a,0,b),d.insertBefore(b,c.nextSibling)},extractInstanceAt:function(a){for(var b=this.getLastInstanceNode(a-1),c=this.getLastInstanceNode(a),d=this.templateElement_.parentNode,e=this.instances.splice(a,1)[0];c!==b;){var f=b.nextSibling;f==c&&(c=b),e.appendChild(d.removeChild(f))}return e},getDelegateFn:function(a){return a=a&&a(this.templateElement_),"function"==typeof a?a:null},handleSplices:function(a){if(!this.closed&&a.length){var b=this.templateElement_;if(!b.parentNode)return void this.close();ArrayObserver.applySplices(this.iteratedValue,this.presentValue,a);var c=b.delegate_;void 0===this.instanceModelFn_&&(this.instanceModelFn_=this.getDelegateFn(c&&c.prepareInstanceModel)),void 0===this.instancePositionChangedFn_&&(this.instancePositionChangedFn_=this.getDelegateFn(c&&c.prepareInstancePositionChanged));for(var d=new F,e=0,f=0;f<a.length;f++){for(var g=a[f],h=g.removed,i=0;i<h.length;i++){var j=h[i],k=this.extractInstanceAt(g.index+e);k!==T&&d.set(j,k)}e-=g.addedCount}for(var f=0;f<a.length;f++)for(var g=a[f],l=g.index;l<g.index+g.addedCount;l++){var j=this.iteratedValue[l],k=d.get(j);k?d.delete(j):(this.instanceModelFn_&&(j=this.instanceModelFn_(j)),k=void 0===j?T:b.createInstance(j,void 0,c)),this.insertInstanceAt(l,k)}d.forEach(function(a){this.closeInstanceBindings(a)},this),this.instancePositionChangedFn_&&this.reportInstancesMoved(a)}},reportInstanceMoved:function(a){var b=this.instances[a];b!==T&&this.instancePositionChangedFn_(b.templateInstance_,a)},reportInstancesMoved:function(a){for(var b=0,c=0,d=0;d<a.length;d++){var e=a[d];if(0!=c)for(;b<e.index;)this.reportInstanceMoved(b),b++;else b=e.index;for(;b<e.index+e.addedCount;)this.reportInstanceMoved(b),b++;c+=e.addedCount-e.removed.length}if(0!=c)for(var f=this.instances.length;f>b;)this.reportInstanceMoved(b),b++},closeInstanceBindings:function(a){for(var b=a.bindings_,c=0;c<b.length;c++)b[c].close()},unobserve:function(){this.arrayObserver&&(this.arrayObserver.close(),this.arrayObserver=void 0)},close:function(){if(!this.closed){this.unobserve();for(var a=0;a<this.instances.length;a++)this.closeInstanceBindings(this.instances[a]);this.instances.length=0,this.closeDeps(),this.templateElement_.iterator_=void 0,this.closed=!0}}},HTMLTemplateElement.forAllTemplatesFrom_=i}(this),function(a){function b(){e||(e=!0,a.endOfMicrotask(function(){e=!1,logFlags.data&&console.group("Platform.flush()"),a.performMicrotaskCheckpoint(),logFlags.data&&console.groupEnd()}))}var c=document.createElement("style");c.textContent="template {display: none !important;} /* injected by platform.js */";var d=document.querySelector("head");d.insertBefore(c,d.firstChild);var e;if(Observer.hasObjectObserve)b=function(){};else{var f=125;window.addEventListener("WebComponentsReady",function(){b(),a.flushPoll=setInterval(b,f)})}if(window.CustomElements&&!CustomElements.useNative){var g=Document.prototype.importNode;Document.prototype.importNode=function(a,b){var c=g.call(this,a,b);return CustomElements.upgradeAll(c),c}}a.flush=b}(window.Platform);
+//# sourceMappingURL=platform.js.map
\ No newline at end of file
diff --git a/examples/pipetobrowser/browser/libs/vendor/polymer/platform/platform.js.map b/examples/pipetobrowser/browser/libs/vendor/polymer/platform/platform.js.map
new file mode 100644
index 0000000..3fca42a
--- /dev/null
+++ b/examples/pipetobrowser/browser/libs/vendor/polymer/platform/platform.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"platform.js","sources":["build/boot.js","../WeakMap/weakmap.js","../observe-js/src/observe.js","build/if-poly.js","../ShadowDOM/src/wrappers.js","../ShadowDOM/src/microtask.js","../ShadowDOM/src/MutationObserver.js","../ShadowDOM/src/TreeScope.js","../ShadowDOM/src/wrappers/events.js","../ShadowDOM/src/wrappers/NodeList.js","../ShadowDOM/src/wrappers/HTMLCollection.js","../ShadowDOM/src/wrappers/Node.js","../ShadowDOM/src/querySelector.js","../ShadowDOM/src/wrappers/node-interfaces.js","../ShadowDOM/src/wrappers/CharacterData.js","../ShadowDOM/src/wrappers/Text.js","../ShadowDOM/src/wrappers/Element.js","../ShadowDOM/src/wrappers/HTMLElement.js","../ShadowDOM/src/wrappers/HTMLCanvasElement.js","../ShadowDOM/src/wrappers/HTMLContentElement.js","../ShadowDOM/src/wrappers/HTMLImageElement.js","../ShadowDOM/src/wrappers/HTMLShadowElement.js","../ShadowDOM/src/wrappers/HTMLTemplateElement.js","../ShadowDOM/src/wrappers/HTMLMediaElement.js","../ShadowDOM/src/wrappers/HTMLAudioElement.js","../ShadowDOM/src/wrappers/HTMLOptionElement.js","../ShadowDOM/src/wrappers/HTMLSelectElement.js","../ShadowDOM/src/wrappers/HTMLTableElement.js","../ShadowDOM/src/wrappers/HTMLTableSectionElement.js","../ShadowDOM/src/wrappers/HTMLTableRowElement.js","../ShadowDOM/src/wrappers/HTMLUnknownElement.js","../ShadowDOM/src/wrappers/SVGElement.js","../ShadowDOM/src/wrappers/SVGUseElement.js","../ShadowDOM/src/wrappers/SVGElementInstance.js","../ShadowDOM/src/wrappers/CanvasRenderingContext2D.js","../ShadowDOM/src/wrappers/WebGLRenderingContext.js","../ShadowDOM/src/wrappers/Range.js","../ShadowDOM/src/wrappers/generic.js","../ShadowDOM/src/wrappers/ShadowRoot.js","../ShadowDOM/src/ShadowRenderer.js","../ShadowDOM/src/wrappers/elements-with-form-property.js","../ShadowDOM/src/wrappers/Selection.js","../ShadowDOM/src/wrappers/Document.js","../ShadowDOM/src/wrappers/Window.js","../ShadowDOM/src/wrappers/DataTransfer.js","../ShadowDOM/src/wrappers/override-constructors.js","src/patches-shadowdom-polyfill.js","src/ShadowCSS.js","src/patches-shadowdom-native.js","../URL/url.js","src/lang.js","src/dom.js","src/template.js","src/inspector.js","src/unresolved.js","src/module.js","src/microtask.js","src/url.js","../MutationObservers/MutationObserver.js","../HTMLImports/src/scope.js","../HTMLImports/src/Loader.js","../HTMLImports/src/Parser.js","../HTMLImports/src/HTMLImports.js","../HTMLImports/src/Observer.js","../HTMLImports/src/boot.js","../CustomElements/src/scope.js","../CustomElements/src/Observer.js","../CustomElements/src/CustomElements.js","../CustomElements/src/Parser.js","../CustomElements/src/boot.js","src/patches-custom-elements.js","src/loader.js","src/styleloader.js","../NodeBind/src/NodeBind.js","../TemplateBinding/src/TemplateBinding.js","src/patches-mdv.js"],"names":[],"mappings":"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","sourcesContent":["/**\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\nwindow.Platform = window.Platform || {};\n// prepopulate window.logFlags if necessary\nwindow.logFlags = window.logFlags || {};\n// process flags\n(function(scope){\n  // import\n  var flags = scope.flags || {};\n  // populate flags from location\n  location.search.slice(1).split('&').forEach(function(o) {\n    o = o.split('=');\n    o[0] && (flags[o[0]] = o[1] || true);\n  });\n  var entryPoint = document.currentScript ||\n      document.querySelector('script[src*=\"platform.js\"]');\n  if (entryPoint) {\n    var a = entryPoint.attributes;\n    for (var i = 0, n; i < a.length; i++) {\n      n = a[i];\n      if (n.name !== 'src') {\n        flags[n.name] = n.value || true;\n      }\n    }\n  }\n  if (flags.log) {\n    flags.log.split(',').forEach(function(f) {\n      window.logFlags[f] = true;\n    });\n  }\n  // If any of these flags match 'native', then force native ShadowDOM; any\n  // other truthy value, or failure to detect native\n  // ShadowDOM, results in polyfill\n  flags.shadow = flags.shadow || flags.shadowdom || flags.polyfill;\n  if (flags.shadow === 'native') {\n    flags.shadow = false;\n  } else {\n    flags.shadow = flags.shadow || !HTMLElement.prototype.createShadowRoot;\n  }\n\n  if (flags.shadow && document.querySelectorAll('script').length > 1) {\n    console.warn('platform.js is not the first script on the page. ' +\n        'See http://www.polymer-project.org/docs/start/platform.html#setup ' +\n        'for details.');\n  }\n\n  // CustomElements polyfill flag\n  if (flags.register) {\n    window.CustomElements = window.CustomElements || {flags: {}};\n    window.CustomElements.flags.register = flags.register;\n  }\n\n  if (flags.imports) {\n    window.HTMLImports = window.HTMLImports || {flags: {}};\n    window.HTMLImports.flags.imports = flags.imports;\n  }\n\n  // export\n  scope.flags = flags;\n})(Platform);\n","/*\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\nif (typeof WeakMap === 'undefined') {\n  (function() {\n    var defineProperty = Object.defineProperty;\n    var counter = Date.now() % 1e9;\n\n    var WeakMap = function() {\n      this.name = '__st' + (Math.random() * 1e9 >>> 0) + (counter++ + '__');\n    };\n\n    WeakMap.prototype = {\n      set: function(key, value) {\n        var entry = key[this.name];\n        if (entry && entry[0] === key)\n          entry[1] = value;\n        else\n          defineProperty(key, this.name, {value: [key, value], writable: true});\n      },\n      get: function(key) {\n        var entry;\n        return (entry = key[this.name]) && entry[0] === key ?\n            entry[1] : undefined;\n      },\n      delete: function(key) {\n        this.set(key, undefined);\n      }\n    };\n\n    window.WeakMap = WeakMap;\n  })();\n}\n","// Copyright 2012 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n(function(global) {\n  'use strict';\n\n  // Detect and do basic sanity checking on Object/Array.observe.\n  function detectObjectObserve() {\n    if (typeof Object.observe !== 'function' ||\n        typeof Array.observe !== 'function') {\n      return false;\n    }\n\n    var records = [];\n\n    function callback(recs) {\n      records = recs;\n    }\n\n    var test = {};\n    var arr = [];\n    Object.observe(test, callback);\n    Array.observe(arr, callback);\n    test.id = 1;\n    test.id = 2;\n    delete test.id;\n    arr.push(1, 2);\n    arr.length = 0;\n\n    Object.deliverChangeRecords(callback);\n    if (records.length !== 5)\n      return false;\n\n    if (records[0].type != 'add' ||\n        records[1].type != 'update' ||\n        records[2].type != 'delete' ||\n        records[3].type != 'splice' ||\n        records[4].type != 'splice') {\n      return false;\n    }\n\n    Object.unobserve(test, callback);\n    Array.unobserve(arr, callback);\n\n    return true;\n  }\n\n  var hasObserve = detectObjectObserve();\n\n  function detectEval() {\n    // don't test for eval if document has CSP securityPolicy object and we can see that\n    // eval is not supported. This avoids an error message in console even when the exception\n    // is caught\n    if (global.document &&\n        'securityPolicy' in global.document &&\n        !global.document.securityPolicy.allowsEval) {\n      return false;\n    }\n\n    // Don't test for eval if we're running in a Chrome App environment.\n    // We check for APIs set that only exist in a Chrome App context.\n    if (typeof chrome !== 'undefined' && chrome.app && chrome.app.runtime) {\n      return false;\n    }\n\n    try {\n      var f = new Function('', 'return true;');\n      return f();\n    } catch (ex) {\n      return false;\n    }\n  }\n\n  var hasEval = detectEval();\n\n  function isIndex(s) {\n    return +s === s >>> 0;\n  }\n\n  function toNumber(s) {\n    return +s;\n  }\n\n  function isObject(obj) {\n    return obj === Object(obj);\n  }\n\n  var numberIsNaN = global.Number.isNaN || function isNaN(value) {\n    return typeof value === 'number' && global.isNaN(value);\n  }\n\n  function areSameValue(left, right) {\n    if (left === right)\n      return left !== 0 || 1 / left === 1 / right;\n    if (numberIsNaN(left) && numberIsNaN(right))\n      return true;\n\n    return left !== left && right !== right;\n  }\n\n  var createObject = ('__proto__' in {}) ?\n    function(obj) { return obj; } :\n    function(obj) {\n      var proto = obj.__proto__;\n      if (!proto)\n        return obj;\n      var newObject = Object.create(proto);\n      Object.getOwnPropertyNames(obj).forEach(function(name) {\n        Object.defineProperty(newObject, name,\n                             Object.getOwnPropertyDescriptor(obj, name));\n      });\n      return newObject;\n    };\n\n  var identStart = '[\\$_a-zA-Z]';\n  var identPart = '[\\$_a-zA-Z0-9]';\n  var ident = identStart + '+' + identPart + '*';\n  var elementIndex = '(?:[0-9]|[1-9]+[0-9]+)';\n  var identOrElementIndex = '(?:' + ident + '|' + elementIndex + ')';\n  var path = '(?:' + identOrElementIndex + ')(?:\\\\s*\\\\.\\\\s*' + identOrElementIndex + ')*';\n  var pathRegExp = new RegExp('^' + path + '$');\n\n  function isPathValid(s) {\n    if (typeof s != 'string')\n      return false;\n    s = s.trim();\n\n    if (s == '')\n      return true;\n\n    if (s[0] == '.')\n      return false;\n\n    return pathRegExp.test(s);\n  }\n\n  var constructorIsPrivate = {};\n\n  function Path(s, privateToken) {\n    if (privateToken !== constructorIsPrivate)\n      throw Error('Use Path.get to retrieve path objects');\n\n    if (s.trim() == '')\n      return this;\n\n    if (isIndex(s)) {\n      this.push(s);\n      return this;\n    }\n\n    s.split(/\\s*\\.\\s*/).filter(function(part) {\n      return part;\n    }).forEach(function(part) {\n      this.push(part);\n    }, this);\n\n    if (hasEval && this.length) {\n      this.getValueFrom = this.compiledGetValueFromFn();\n    }\n  }\n\n  // TODO(rafaelw): Make simple LRU cache\n  var pathCache = {};\n\n  function getPath(pathString) {\n    if (pathString instanceof Path)\n      return pathString;\n\n    if (pathString == null)\n      pathString = '';\n\n    if (typeof pathString !== 'string')\n      pathString = String(pathString);\n\n    var path = pathCache[pathString];\n    if (path)\n      return path;\n    if (!isPathValid(pathString))\n      return invalidPath;\n    var path = new Path(pathString, constructorIsPrivate);\n    pathCache[pathString] = path;\n    return path;\n  }\n\n  Path.get = getPath;\n\n  Path.prototype = createObject({\n    __proto__: [],\n    valid: true,\n\n    toString: function() {\n      return this.join('.');\n    },\n\n    getValueFrom: function(obj, directObserver) {\n      for (var i = 0; i < this.length; i++) {\n        if (obj == null)\n          return;\n        obj = obj[this[i]];\n      }\n      return obj;\n    },\n\n    iterateObjects: function(obj, observe) {\n      for (var i = 0; i < this.length; i++) {\n        if (i)\n          obj = obj[this[i - 1]];\n        if (!isObject(obj))\n          return;\n        observe(obj, this[0]);\n      }\n    },\n\n    compiledGetValueFromFn: function() {\n      var accessors = this.map(function(ident) {\n        return isIndex(ident) ? '[\"' + ident + '\"]' : '.' + ident;\n      });\n\n      var str = '';\n      var pathString = 'obj';\n      str += 'if (obj != null';\n      var i = 0;\n      for (; i < (this.length - 1); i++) {\n        var ident = this[i];\n        pathString += accessors[i];\n        str += ' &&\\n     ' + pathString + ' != null';\n      }\n      str += ')\\n';\n\n      pathString += accessors[i];\n\n      str += '  return ' + pathString + ';\\nelse\\n  return undefined;';\n      return new Function('obj', str);\n    },\n\n    setValueFrom: function(obj, value) {\n      if (!this.length)\n        return false;\n\n      for (var i = 0; i < this.length - 1; i++) {\n        if (!isObject(obj))\n          return false;\n        obj = obj[this[i]];\n      }\n\n      if (!isObject(obj))\n        return false;\n\n      obj[this[i]] = value;\n      return true;\n    }\n  });\n\n  var invalidPath = new Path('', constructorIsPrivate);\n  invalidPath.valid = false;\n  invalidPath.getValueFrom = invalidPath.setValueFrom = function() {};\n\n  var MAX_DIRTY_CHECK_CYCLES = 1000;\n\n  function dirtyCheck(observer) {\n    var cycles = 0;\n    while (cycles < MAX_DIRTY_CHECK_CYCLES && observer.check_()) {\n      cycles++;\n    }\n    if (global.testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    return cycles > 0;\n  }\n\n  function objectIsEmpty(object) {\n    for (var prop in object)\n      return false;\n    return true;\n  }\n\n  function diffIsEmpty(diff) {\n    return objectIsEmpty(diff.added) &&\n           objectIsEmpty(diff.removed) &&\n           objectIsEmpty(diff.changed);\n  }\n\n  function diffObjectFromOldObject(object, oldObject) {\n    var added = {};\n    var removed = {};\n    var changed = {};\n\n    for (var prop in oldObject) {\n      var newValue = object[prop];\n\n      if (newValue !== undefined && newValue === oldObject[prop])\n        continue;\n\n      if (!(prop in object)) {\n        removed[prop] = undefined;\n        continue;\n      }\n\n      if (newValue !== oldObject[prop])\n        changed[prop] = newValue;\n    }\n\n    for (var prop in object) {\n      if (prop in oldObject)\n        continue;\n\n      added[prop] = object[prop];\n    }\n\n    if (Array.isArray(object) && object.length !== oldObject.length)\n      changed.length = object.length;\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  var eomTasks = [];\n  function runEOMTasks() {\n    if (!eomTasks.length)\n      return false;\n\n    for (var i = 0; i < eomTasks.length; i++) {\n      eomTasks[i]();\n    }\n    eomTasks.length = 0;\n    return true;\n  }\n\n  var runEOM = hasObserve ? (function(){\n    var eomObj = { pingPong: true };\n    var eomRunScheduled = false;\n\n    Object.observe(eomObj, function() {\n      runEOMTasks();\n      eomRunScheduled = false;\n    });\n\n    return function(fn) {\n      eomTasks.push(fn);\n      if (!eomRunScheduled) {\n        eomRunScheduled = true;\n        eomObj.pingPong = !eomObj.pingPong;\n      }\n    };\n  })() :\n  (function() {\n    return function(fn) {\n      eomTasks.push(fn);\n    };\n  })();\n\n  var observedObjectCache = [];\n\n  function newObservedObject() {\n    var observer;\n    var object;\n    var discardRecords = false;\n    var first = true;\n\n    function callback(records) {\n      if (observer && observer.state_ === OPENED && !discardRecords)\n        observer.check_(records);\n    }\n\n    return {\n      open: function(obs) {\n        if (observer)\n          throw Error('ObservedObject in use');\n\n        if (!first)\n          Object.deliverChangeRecords(callback);\n\n        observer = obs;\n        first = false;\n      },\n      observe: function(obj, arrayObserve) {\n        object = obj;\n        if (arrayObserve)\n          Array.observe(object, callback);\n        else\n          Object.observe(object, callback);\n      },\n      deliver: function(discard) {\n        discardRecords = discard;\n        Object.deliverChangeRecords(callback);\n        discardRecords = false;\n      },\n      close: function() {\n        observer = undefined;\n        Object.unobserve(object, callback);\n        observedObjectCache.push(this);\n      }\n    };\n  }\n\n  /*\n   * The observedSet abstraction is a perf optimization which reduces the total\n   * number of Object.observe observations of a set of objects. The idea is that\n   * groups of Observers will have some object dependencies in common and this\n   * observed set ensures that each object in the transitive closure of\n   * dependencies is only observed once. The observedSet acts as a write barrier\n   * such that whenever any change comes through, all Observers are checked for\n   * changed values.\n   *\n   * Note that this optimization is explicitly moving work from setup-time to\n   * change-time.\n   *\n   * TODO(rafaelw): Implement \"garbage collection\". In order to move work off\n   * the critical path, when Observers are closed, their observed objects are\n   * not Object.unobserve(d). As a result, it's possible that if the observedSet\n   * is kept open, but some Observers have been closed, it could cause \"leaks\"\n   * (prevent otherwise collectable objects from being collected). At some\n   * point, we should implement incremental \"gc\" which keeps a list of\n   * observedSets which may need clean-up and does small amounts of cleanup on a\n   * timeout until all is clean.\n   */\n\n  function getObservedObject(observer, object, arrayObserve) {\n    var dir = observedObjectCache.pop() || newObservedObject();\n    dir.open(observer);\n    dir.observe(object, arrayObserve);\n    return dir;\n  }\n\n  var observedSetCache = [];\n\n  function newObservedSet() {\n    var observerCount = 0;\n    var observers = [];\n    var objects = [];\n    var rootObj;\n    var rootObjProps;\n\n    function observe(obj, prop) {\n      if (!obj)\n        return;\n\n      if (obj === rootObj)\n        rootObjProps[prop] = true;\n\n      if (objects.indexOf(obj) < 0) {\n        objects.push(obj);\n        Object.observe(obj, callback);\n      }\n\n      observe(Object.getPrototypeOf(obj), prop);\n    }\n\n    function allRootObjNonObservedProps(recs) {\n      for (var i = 0; i < recs.length; i++) {\n        var rec = recs[i];\n        if (rec.object !== rootObj ||\n            rootObjProps[rec.name] ||\n            rec.type === 'setPrototype') {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    function callback(recs) {\n      if (allRootObjNonObservedProps(recs))\n        return;\n\n      var observer;\n      for (var i = 0; i < observers.length; i++) {\n        observer = observers[i];\n        if (observer.state_ == OPENED) {\n          observer.iterateObjects_(observe);\n        }\n      }\n\n      for (var i = 0; i < observers.length; i++) {\n        observer = observers[i];\n        if (observer.state_ == OPENED) {\n          observer.check_();\n        }\n      }\n    }\n\n    var record = {\n      object: undefined,\n      objects: objects,\n      open: function(obs, object) {\n        if (!rootObj) {\n          rootObj = object;\n          rootObjProps = {};\n        }\n\n        observers.push(obs);\n        observerCount++;\n        obs.iterateObjects_(observe);\n      },\n      close: function(obs) {\n        observerCount--;\n        if (observerCount > 0) {\n          return;\n        }\n\n        for (var i = 0; i < objects.length; i++) {\n          Object.unobserve(objects[i], callback);\n          Observer.unobservedCount++;\n        }\n\n        observers.length = 0;\n        objects.length = 0;\n        rootObj = undefined;\n        rootObjProps = undefined;\n        observedSetCache.push(this);\n      }\n    };\n\n    return record;\n  }\n\n  var lastObservedSet;\n\n  function getObservedSet(observer, obj) {\n    if (!lastObservedSet || lastObservedSet.object !== obj) {\n      lastObservedSet = observedSetCache.pop() || newObservedSet();\n      lastObservedSet.object = obj;\n    }\n    lastObservedSet.open(observer, obj);\n    return lastObservedSet;\n  }\n\n  var UNOPENED = 0;\n  var OPENED = 1;\n  var CLOSED = 2;\n  var RESETTING = 3;\n\n  var nextObserverId = 1;\n\n  function Observer() {\n    this.state_ = UNOPENED;\n    this.callback_ = undefined;\n    this.target_ = undefined; // TODO(rafaelw): Should be WeakRef\n    this.directObserver_ = undefined;\n    this.value_ = undefined;\n    this.id_ = nextObserverId++;\n  }\n\n  Observer.prototype = {\n    open: function(callback, target) {\n      if (this.state_ != UNOPENED)\n        throw Error('Observer has already been opened.');\n\n      addToAll(this);\n      this.callback_ = callback;\n      this.target_ = target;\n      this.connect_();\n      this.state_ = OPENED;\n      return this.value_;\n    },\n\n    close: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      removeFromAll(this);\n      this.disconnect_();\n      this.value_ = undefined;\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.state_ = CLOSED;\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      dirtyCheck(this);\n    },\n\n    report_: function(changes) {\n      try {\n        this.callback_.apply(this.target_, changes);\n      } catch (ex) {\n        Observer._errorThrownDuringCallback = true;\n        console.error('Exception caught during observer callback: ' +\n                       (ex.stack || ex));\n      }\n    },\n\n    discardChanges: function() {\n      this.check_(undefined, true);\n      return this.value_;\n    }\n  }\n\n  var collectObservers = !hasObserve;\n  var allObservers;\n  Observer._allObserversCount = 0;\n\n  if (collectObservers) {\n    allObservers = [];\n  }\n\n  function addToAll(observer) {\n    Observer._allObserversCount++;\n    if (!collectObservers)\n      return;\n\n    allObservers.push(observer);\n  }\n\n  function removeFromAll(observer) {\n    Observer._allObserversCount--;\n  }\n\n  var runningMicrotaskCheckpoint = false;\n\n  var hasDebugForceFullDelivery = hasObserve && (function() {\n    try {\n      eval('%RunMicrotasks()');\n      return true;\n    } catch (ex) {\n      return false;\n    }\n  })();\n\n  global.Platform = global.Platform || {};\n\n  global.Platform.performMicrotaskCheckpoint = function() {\n    if (runningMicrotaskCheckpoint)\n      return;\n\n    if (hasDebugForceFullDelivery) {\n      eval('%RunMicrotasks()');\n      return;\n    }\n\n    if (!collectObservers)\n      return;\n\n    runningMicrotaskCheckpoint = true;\n\n    var cycles = 0;\n    var anyChanged, toCheck;\n\n    do {\n      cycles++;\n      toCheck = allObservers;\n      allObservers = [];\n      anyChanged = false;\n\n      for (var i = 0; i < toCheck.length; i++) {\n        var observer = toCheck[i];\n        if (observer.state_ != OPENED)\n          continue;\n\n        if (observer.check_())\n          anyChanged = true;\n\n        allObservers.push(observer);\n      }\n      if (runEOMTasks())\n        anyChanged = true;\n    } while (cycles < MAX_DIRTY_CHECK_CYCLES && anyChanged);\n\n    if (global.testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    runningMicrotaskCheckpoint = false;\n  };\n\n  if (collectObservers) {\n    global.Platform.clearObservers = function() {\n      allObservers = [];\n    };\n  }\n\n  function ObjectObserver(object) {\n    Observer.call(this);\n    this.value_ = object;\n    this.oldObject_ = undefined;\n  }\n\n  ObjectObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    arrayObserve: false,\n\n    connect_: function(callback, target) {\n      if (hasObserve) {\n        this.directObserver_ = getObservedObject(this, this.value_,\n                                                 this.arrayObserve);\n      } else {\n        this.oldObject_ = this.copyObject(this.value_);\n      }\n\n    },\n\n    copyObject: function(object) {\n      var copy = Array.isArray(object) ? [] : {};\n      for (var prop in object) {\n        copy[prop] = object[prop];\n      };\n      if (Array.isArray(object))\n        copy.length = object.length;\n      return copy;\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var diff;\n      var oldValues;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n\n        oldValues = {};\n        diff = diffObjectFromChangeRecords(this.value_, changeRecords,\n                                           oldValues);\n      } else {\n        oldValues = this.oldObject_;\n        diff = diffObjectFromOldObject(this.value_, this.oldObject_);\n      }\n\n      if (diffIsEmpty(diff))\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([\n        diff.added || {},\n        diff.removed || {},\n        diff.changed || {},\n        function(property) {\n          return oldValues[property];\n        }\n      ]);\n\n      return true;\n    },\n\n    disconnect_: function() {\n      if (hasObserve) {\n        this.directObserver_.close();\n        this.directObserver_ = undefined;\n      } else {\n        this.oldObject_ = undefined;\n      }\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      if (hasObserve)\n        this.directObserver_.deliver(false);\n      else\n        dirtyCheck(this);\n    },\n\n    discardChanges: function() {\n      if (this.directObserver_)\n        this.directObserver_.deliver(true);\n      else\n        this.oldObject_ = this.copyObject(this.value_);\n\n      return this.value_;\n    }\n  });\n\n  function ArrayObserver(array) {\n    if (!Array.isArray(array))\n      throw Error('Provided object is not an Array');\n    ObjectObserver.call(this, array);\n  }\n\n  ArrayObserver.prototype = createObject({\n\n    __proto__: ObjectObserver.prototype,\n\n    arrayObserve: true,\n\n    copyObject: function(arr) {\n      return arr.slice();\n    },\n\n    check_: function(changeRecords) {\n      var splices;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n        splices = projectArraySplices(this.value_, changeRecords);\n      } else {\n        splices = calcSplices(this.value_, 0, this.value_.length,\n                              this.oldObject_, 0, this.oldObject_.length);\n      }\n\n      if (!splices || !splices.length)\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([splices]);\n      return true;\n    }\n  });\n\n  ArrayObserver.applySplices = function(previous, current, splices) {\n    splices.forEach(function(splice) {\n      var spliceArgs = [splice.index, splice.removed.length];\n      var addIndex = splice.index;\n      while (addIndex < splice.index + splice.addedCount) {\n        spliceArgs.push(current[addIndex]);\n        addIndex++;\n      }\n\n      Array.prototype.splice.apply(previous, spliceArgs);\n    });\n  };\n\n  function PathObserver(object, path) {\n    Observer.call(this);\n\n    this.object_ = object;\n    this.path_ = getPath(path);\n    this.directObserver_ = undefined;\n  }\n\n  PathObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    connect_: function() {\n      if (hasObserve)\n        this.directObserver_ = getObservedSet(this, this.object_);\n\n      this.check_(undefined, true);\n    },\n\n    disconnect_: function() {\n      this.value_ = undefined;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n    },\n\n    iterateObjects_: function(observe) {\n      this.path_.iterateObjects(this.object_, observe);\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValue = this.value_;\n      this.value_ = this.path_.getValueFrom(this.object_);\n      if (skipChanges || areSameValue(this.value_, oldValue))\n        return false;\n\n      this.report_([this.value_, oldValue]);\n      return true;\n    },\n\n    setValue: function(newValue) {\n      if (this.path_)\n        this.path_.setValueFrom(this.object_, newValue);\n    }\n  });\n\n  function CompoundObserver(reportChangesOnOpen) {\n    Observer.call(this);\n\n    this.reportChangesOnOpen_ = reportChangesOnOpen;\n    this.value_ = [];\n    this.directObserver_ = undefined;\n    this.observed_ = [];\n  }\n\n  var observerSentinel = {};\n\n  CompoundObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    connect_: function() {\n      if (hasObserve) {\n        var object;\n        var needsDirectObserver = false;\n        for (var i = 0; i < this.observed_.length; i += 2) {\n          object = this.observed_[i]\n          if (object !== observerSentinel) {\n            needsDirectObserver = true;\n            break;\n          }\n        }\n\n        if (needsDirectObserver)\n          this.directObserver_ = getObservedSet(this, object);\n      }\n\n      this.check_(undefined, !this.reportChangesOnOpen_);\n    },\n\n    disconnect_: function() {\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        if (this.observed_[i] === observerSentinel)\n          this.observed_[i + 1].close();\n      }\n      this.observed_.length = 0;\n      this.value_.length = 0;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n    },\n\n    addPath: function(object, path) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add paths once started.');\n\n      var path = getPath(path);\n      this.observed_.push(object, path);\n      if (!this.reportChangesOnOpen_)\n        return;\n      var index = this.observed_.length / 2 - 1;\n      this.value_[index] = path.getValueFrom(object);\n    },\n\n    addObserver: function(observer) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add observers once started.');\n\n      this.observed_.push(observerSentinel, observer);\n      if (!this.reportChangesOnOpen_)\n        return;\n      var index = this.observed_.length / 2 - 1;\n      this.value_[index] = observer.open(this.deliver, this);\n    },\n\n    startReset: function() {\n      if (this.state_ != OPENED)\n        throw Error('Can only reset while open');\n\n      this.state_ = RESETTING;\n      this.disconnect_();\n    },\n\n    finishReset: function() {\n      if (this.state_ != RESETTING)\n        throw Error('Can only finishReset after startReset');\n      this.state_ = OPENED;\n      this.connect_();\n\n      return this.value_;\n    },\n\n    iterateObjects_: function(observe) {\n      var object;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        object = this.observed_[i]\n        if (object !== observerSentinel)\n          this.observed_[i + 1].iterateObjects(object, observe)\n      }\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValues;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        var object = this.observed_[i];\n        var path = this.observed_[i+1];\n        var value;\n        if (object === observerSentinel) {\n          var observable = path;\n          value = this.state_ === UNOPENED ?\n              observable.open(this.deliver, this) :\n              observable.discardChanges();\n        } else {\n          value = path.getValueFrom(object);\n        }\n\n        if (skipChanges) {\n          this.value_[i / 2] = value;\n          continue;\n        }\n\n        if (areSameValue(value, this.value_[i / 2]))\n          continue;\n\n        oldValues = oldValues || [];\n        oldValues[i / 2] = this.value_[i / 2];\n        this.value_[i / 2] = value;\n      }\n\n      if (!oldValues)\n        return false;\n\n      // TODO(rafaelw): Having observed_ as the third callback arg here is\n      // pretty lame API. Fix.\n      this.report_([this.value_, oldValues, this.observed_]);\n      return true;\n    }\n  });\n\n  function identFn(value) { return value; }\n\n  function ObserverTransform(observable, getValueFn, setValueFn,\n                             dontPassThroughSet) {\n    this.callback_ = undefined;\n    this.target_ = undefined;\n    this.value_ = undefined;\n    this.observable_ = observable;\n    this.getValueFn_ = getValueFn || identFn;\n    this.setValueFn_ = setValueFn || identFn;\n    // TODO(rafaelw): This is a temporary hack. PolymerExpressions needs this\n    // at the moment because of a bug in it's dependency tracking.\n    this.dontPassThroughSet_ = dontPassThroughSet;\n  }\n\n  ObserverTransform.prototype = {\n    open: function(callback, target) {\n      this.callback_ = callback;\n      this.target_ = target;\n      this.value_ =\n          this.getValueFn_(this.observable_.open(this.observedCallback_, this));\n      return this.value_;\n    },\n\n    observedCallback_: function(value) {\n      value = this.getValueFn_(value);\n      if (areSameValue(value, this.value_))\n        return;\n      var oldValue = this.value_;\n      this.value_ = value;\n      this.callback_.call(this.target_, this.value_, oldValue);\n    },\n\n    discardChanges: function() {\n      this.value_ = this.getValueFn_(this.observable_.discardChanges());\n      return this.value_;\n    },\n\n    deliver: function() {\n      return this.observable_.deliver();\n    },\n\n    setValue: function(value) {\n      value = this.setValueFn_(value);\n      if (!this.dontPassThroughSet_ && this.observable_.setValue)\n        return this.observable_.setValue(value);\n    },\n\n    close: function() {\n      if (this.observable_)\n        this.observable_.close();\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.observable_ = undefined;\n      this.value_ = undefined;\n      this.getValueFn_ = undefined;\n      this.setValueFn_ = undefined;\n    }\n  }\n\n  var expectedRecordTypes = {\n    add: true,\n    update: true,\n    delete: true\n  };\n\n var updateRecord = {\n    object: undefined,\n    type: 'update',\n    name: undefined,\n    oldValue: undefined\n  };\n\n  function notify(object, name, value, oldValue) {\n    if (areSameValue(value, oldValue))\n      return;\n\n    // TODO(rafaelw): Hack hack hack. This entire code really needs to move\n    // out of observe-js into polymer.\n    if (typeof object.propertyChanged_ == 'function')\n      object.propertyChanged_(name, value, oldValue);\n\n    if (!hasObserve)\n      return;\n\n    var notifier = object.notifier_;\n    if (!notifier)\n      notifier = object.notifier_ = Object.getNotifier(object);\n\n    updateRecord.object = object;\n    updateRecord.name = name;\n    updateRecord.oldValue = oldValue;\n\n    notifier.notify(updateRecord);\n  }\n\n  Observer.createBindablePrototypeAccessor = function(proto, name) {\n    var privateName = name + '_';\n    var privateObservable  = name + 'Observable_';\n\n    proto[privateName] = proto[name];\n\n    Object.defineProperty(proto, name, {\n      get: function() {\n        var observable = this[privateObservable];\n        if (observable)\n          observable.deliver();\n\n        return this[privateName];\n      },\n      set: function(value) {\n        var observable = this[privateObservable];\n        if (observable) {\n          observable.setValue(value);\n          return;\n        }\n\n        var oldValue = this[privateName];\n        this[privateName] = value;\n        notify(this, name, value, oldValue);\n\n        return value;\n      },\n      configurable: true\n    });\n  }\n\n  Observer.bindToInstance = function(instance, name, observable, resolveFn) {\n    var privateName = name + '_';\n    var privateObservable  = name + 'Observable_';\n\n    instance[privateObservable] = observable;\n    var oldValue = instance[privateName];\n    var value = observable.open(function(value, oldValue) {\n      instance[privateName] = value;\n      notify(instance, name, value, oldValue);\n    });\n\n    if (resolveFn && !areSameValue(oldValue, value)) {\n      var resolvedValue = resolveFn(oldValue, value);\n      if (!areSameValue(value, resolvedValue)) {\n        value = resolvedValue;\n        if (observable.setValue)\n          observable.setValue(value);\n      }\n    }\n\n    instance[privateName] = value;\n    notify(instance, name, value, oldValue);\n\n    return {\n      close: function() {\n        observable.close();\n        instance[privateObservable] = undefined;\n      }\n    };\n  }\n\n  function diffObjectFromChangeRecords(object, changeRecords, oldValues) {\n    var added = {};\n    var removed = {};\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      if (!expectedRecordTypes[record.type]) {\n        console.error('Unknown changeRecord type: ' + record.type);\n        console.error(record);\n        continue;\n      }\n\n      if (!(record.name in oldValues))\n        oldValues[record.name] = record.oldValue;\n\n      if (record.type == 'update')\n        continue;\n\n      if (record.type == 'add') {\n        if (record.name in removed)\n          delete removed[record.name];\n        else\n          added[record.name] = true;\n\n        continue;\n      }\n\n      // type = 'delete'\n      if (record.name in added) {\n        delete added[record.name];\n        delete oldValues[record.name];\n      } else {\n        removed[record.name] = true;\n      }\n    }\n\n    for (var prop in added)\n      added[prop] = object[prop];\n\n    for (var prop in removed)\n      removed[prop] = undefined;\n\n    var changed = {};\n    for (var prop in oldValues) {\n      if (prop in added || prop in removed)\n        continue;\n\n      var newValue = object[prop];\n      if (oldValues[prop] !== newValue)\n        changed[prop] = newValue;\n    }\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  function newSplice(index, removed, addedCount) {\n    return {\n      index: index,\n      removed: removed,\n      addedCount: addedCount\n    };\n  }\n\n  var EDIT_LEAVE = 0;\n  var EDIT_UPDATE = 1;\n  var EDIT_ADD = 2;\n  var EDIT_DELETE = 3;\n\n  function ArraySplice() {}\n\n  ArraySplice.prototype = {\n\n    // Note: This function is *based* on the computation of the Levenshtein\n    // \"edit\" distance. The one change is that \"updates\" are treated as two\n    // edits - not one. With Array splices, an update is really a delete\n    // followed by an add. By retaining this, we optimize for \"keeping\" the\n    // maximum array items in the original array. For example:\n    //\n    //   'xxxx123' -> '123yyyy'\n    //\n    // With 1-edit updates, the shortest path would be just to update all seven\n    // characters. With 2-edit updates, we delete 4, leave 3, and add 4. This\n    // leaves the substring '123' intact.\n    calcEditDistances: function(current, currentStart, currentEnd,\n                                old, oldStart, oldEnd) {\n      // \"Deletion\" columns\n      var rowCount = oldEnd - oldStart + 1;\n      var columnCount = currentEnd - currentStart + 1;\n      var distances = new Array(rowCount);\n\n      // \"Addition\" rows. Initialize null column.\n      for (var i = 0; i < rowCount; i++) {\n        distances[i] = new Array(columnCount);\n        distances[i][0] = i;\n      }\n\n      // Initialize null row\n      for (var j = 0; j < columnCount; j++)\n        distances[0][j] = j;\n\n      for (var i = 1; i < rowCount; i++) {\n        for (var j = 1; j < columnCount; j++) {\n          if (this.equals(current[currentStart + j - 1], old[oldStart + i - 1]))\n            distances[i][j] = distances[i - 1][j - 1];\n          else {\n            var north = distances[i - 1][j] + 1;\n            var west = distances[i][j - 1] + 1;\n            distances[i][j] = north < west ? north : west;\n          }\n        }\n      }\n\n      return distances;\n    },\n\n    // This starts at the final weight, and walks \"backward\" by finding\n    // the minimum previous weight recursively until the origin of the weight\n    // matrix.\n    spliceOperationsFromEditDistances: function(distances) {\n      var i = distances.length - 1;\n      var j = distances[0].length - 1;\n      var current = distances[i][j];\n      var edits = [];\n      while (i > 0 || j > 0) {\n        if (i == 0) {\n          edits.push(EDIT_ADD);\n          j--;\n          continue;\n        }\n        if (j == 0) {\n          edits.push(EDIT_DELETE);\n          i--;\n          continue;\n        }\n        var northWest = distances[i - 1][j - 1];\n        var west = distances[i - 1][j];\n        var north = distances[i][j - 1];\n\n        var min;\n        if (west < north)\n          min = west < northWest ? west : northWest;\n        else\n          min = north < northWest ? north : northWest;\n\n        if (min == northWest) {\n          if (northWest == current) {\n            edits.push(EDIT_LEAVE);\n          } else {\n            edits.push(EDIT_UPDATE);\n            current = northWest;\n          }\n          i--;\n          j--;\n        } else if (min == west) {\n          edits.push(EDIT_DELETE);\n          i--;\n          current = west;\n        } else {\n          edits.push(EDIT_ADD);\n          j--;\n          current = north;\n        }\n      }\n\n      edits.reverse();\n      return edits;\n    },\n\n    /**\n     * Splice Projection functions:\n     *\n     * A splice map is a representation of how a previous array of items\n     * was transformed into a new array of items. Conceptually it is a list of\n     * tuples of\n     *\n     *   <index, removed, addedCount>\n     *\n     * which are kept in ascending index order of. The tuple represents that at\n     * the |index|, |removed| sequence of items were removed, and counting forward\n     * from |index|, |addedCount| items were added.\n     */\n\n    /**\n     * Lacking individual splice mutation information, the minimal set of\n     * splices can be synthesized given the previous state and final state of an\n     * array. The basic approach is to calculate the edit distance matrix and\n     * choose the shortest path through it.\n     *\n     * Complexity: O(l * p)\n     *   l: The length of the current array\n     *   p: The length of the old array\n     */\n    calcSplices: function(current, currentStart, currentEnd,\n                          old, oldStart, oldEnd) {\n      var prefixCount = 0;\n      var suffixCount = 0;\n\n      var minLength = Math.min(currentEnd - currentStart, oldEnd - oldStart);\n      if (currentStart == 0 && oldStart == 0)\n        prefixCount = this.sharedPrefix(current, old, minLength);\n\n      if (currentEnd == current.length && oldEnd == old.length)\n        suffixCount = this.sharedSuffix(current, old, minLength - prefixCount);\n\n      currentStart += prefixCount;\n      oldStart += prefixCount;\n      currentEnd -= suffixCount;\n      oldEnd -= suffixCount;\n\n      if (currentEnd - currentStart == 0 && oldEnd - oldStart == 0)\n        return [];\n\n      if (currentStart == currentEnd) {\n        var splice = newSplice(currentStart, [], 0);\n        while (oldStart < oldEnd)\n          splice.removed.push(old[oldStart++]);\n\n        return [ splice ];\n      } else if (oldStart == oldEnd)\n        return [ newSplice(currentStart, [], currentEnd - currentStart) ];\n\n      var ops = this.spliceOperationsFromEditDistances(\n          this.calcEditDistances(current, currentStart, currentEnd,\n                                 old, oldStart, oldEnd));\n\n      var splice = undefined;\n      var splices = [];\n      var index = currentStart;\n      var oldIndex = oldStart;\n      for (var i = 0; i < ops.length; i++) {\n        switch(ops[i]) {\n          case EDIT_LEAVE:\n            if (splice) {\n              splices.push(splice);\n              splice = undefined;\n            }\n\n            index++;\n            oldIndex++;\n            break;\n          case EDIT_UPDATE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n          case EDIT_ADD:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n            break;\n          case EDIT_DELETE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n        }\n      }\n\n      if (splice) {\n        splices.push(splice);\n      }\n      return splices;\n    },\n\n    sharedPrefix: function(current, old, searchLength) {\n      for (var i = 0; i < searchLength; i++)\n        if (!this.equals(current[i], old[i]))\n          return i;\n      return searchLength;\n    },\n\n    sharedSuffix: function(current, old, searchLength) {\n      var index1 = current.length;\n      var index2 = old.length;\n      var count = 0;\n      while (count < searchLength && this.equals(current[--index1], old[--index2]))\n        count++;\n\n      return count;\n    },\n\n    calculateSplices: function(current, previous) {\n      return this.calcSplices(current, 0, current.length, previous, 0,\n                              previous.length);\n    },\n\n    equals: function(currentValue, previousValue) {\n      return currentValue === previousValue;\n    }\n  };\n\n  var arraySplice = new ArraySplice();\n\n  function calcSplices(current, currentStart, currentEnd,\n                       old, oldStart, oldEnd) {\n    return arraySplice.calcSplices(current, currentStart, currentEnd,\n                                   old, oldStart, oldEnd);\n  }\n\n  function intersect(start1, end1, start2, end2) {\n    // Disjoint\n    if (end1 < start2 || end2 < start1)\n      return -1;\n\n    // Adjacent\n    if (end1 == start2 || end2 == start1)\n      return 0;\n\n    // Non-zero intersect, span1 first\n    if (start1 < start2) {\n      if (end1 < end2)\n        return end1 - start2; // Overlap\n      else\n        return end2 - start2; // Contained\n    } else {\n      // Non-zero intersect, span2 first\n      if (end2 < end1)\n        return end2 - start1; // Overlap\n      else\n        return end1 - start1; // Contained\n    }\n  }\n\n  function mergeSplice(splices, index, removed, addedCount) {\n\n    var splice = newSplice(index, removed, addedCount);\n\n    var inserted = false;\n    var insertionOffset = 0;\n\n    for (var i = 0; i < splices.length; i++) {\n      var current = splices[i];\n      current.index += insertionOffset;\n\n      if (inserted)\n        continue;\n\n      var intersectCount = intersect(splice.index,\n                                     splice.index + splice.removed.length,\n                                     current.index,\n                                     current.index + current.addedCount);\n\n      if (intersectCount >= 0) {\n        // Merge the two splices\n\n        splices.splice(i, 1);\n        i--;\n\n        insertionOffset -= current.addedCount - current.removed.length;\n\n        splice.addedCount += current.addedCount - intersectCount;\n        var deleteCount = splice.removed.length +\n                          current.removed.length - intersectCount;\n\n        if (!splice.addedCount && !deleteCount) {\n          // merged splice is a noop. discard.\n          inserted = true;\n        } else {\n          var removed = current.removed;\n\n          if (splice.index < current.index) {\n            // some prefix of splice.removed is prepended to current.removed.\n            var prepend = splice.removed.slice(0, current.index - splice.index);\n            Array.prototype.push.apply(prepend, removed);\n            removed = prepend;\n          }\n\n          if (splice.index + splice.removed.length > current.index + current.addedCount) {\n            // some suffix of splice.removed is appended to current.removed.\n            var append = splice.removed.slice(current.index + current.addedCount - splice.index);\n            Array.prototype.push.apply(removed, append);\n          }\n\n          splice.removed = removed;\n          if (current.index < splice.index) {\n            splice.index = current.index;\n          }\n        }\n      } else if (splice.index < current.index) {\n        // Insert splice here.\n\n        inserted = true;\n\n        splices.splice(i, 0, splice);\n        i++;\n\n        var offset = splice.addedCount - splice.removed.length\n        current.index += offset;\n        insertionOffset += offset;\n      }\n    }\n\n    if (!inserted)\n      splices.push(splice);\n  }\n\n  function createInitialSplices(array, changeRecords) {\n    var splices = [];\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      switch(record.type) {\n        case 'splice':\n          mergeSplice(splices, record.index, record.removed.slice(), record.addedCount);\n          break;\n        case 'add':\n        case 'update':\n        case 'delete':\n          if (!isIndex(record.name))\n            continue;\n          var index = toNumber(record.name);\n          if (index < 0)\n            continue;\n          mergeSplice(splices, index, [record.oldValue], 1);\n          break;\n        default:\n          console.error('Unexpected record type: ' + JSON.stringify(record));\n          break;\n      }\n    }\n\n    return splices;\n  }\n\n  function projectArraySplices(array, changeRecords) {\n    var splices = [];\n\n    createInitialSplices(array, changeRecords).forEach(function(splice) {\n      if (splice.addedCount == 1 && splice.removed.length == 1) {\n        if (splice.removed[0] !== array[splice.index])\n          splices.push(splice);\n\n        return\n      };\n\n      splices = splices.concat(calcSplices(array, splice.index, splice.index + splice.addedCount,\n                                           splice.removed, 0, splice.removed.length));\n    });\n\n    return splices;\n  }\n\n  global.Observer = Observer;\n  global.Observer.runEOM_ = runEOM;\n  global.Observer.observerSentinel_ = observerSentinel; // for testing.\n  global.Observer.hasObjectObserve = hasObserve;\n  global.ArrayObserver = ArrayObserver;\n  global.ArrayObserver.calculateSplices = function(current, previous) {\n    return arraySplice.calculateSplices(current, previous);\n  };\n\n  global.ArraySplice = ArraySplice;\n  global.ObjectObserver = ObjectObserver;\n  global.PathObserver = PathObserver;\n  global.CompoundObserver = CompoundObserver;\n  global.Path = Path;\n  global.ObserverTransform = ObserverTransform;\n})(typeof global !== 'undefined' && global && typeof module !== 'undefined' && module ? global : this || window);\n","// select ShadowDOM impl\r\nif (Platform.flags.shadow) {\r\n","// Copyright 2012 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\nwindow.ShadowDOMPolyfill = {};\n\n(function(scope) {\n  'use strict';\n\n  var constructorTable = new WeakMap();\n  var nativePrototypeTable = new WeakMap();\n  var wrappers = Object.create(null);\n\n  // Don't test for eval if document has CSP securityPolicy object and we can\n  // see that eval is not supported. This avoids an error message in console\n  // even when the exception is caught\n  var hasEval = !('securityPolicy' in document) ||\n      document.securityPolicy.allowsEval;\n\n  if (typeof chrome !== 'undefined' && chrome.app && chrome.app.runtime) {\n    hasEval = false;\n  }\n\n  if (hasEval) {\n    try {\n      var f = new Function('', 'return true;');\n      hasEval = f();\n    } catch (ex) {\n      hasEval = false;\n    }\n  }\n\n  function assert(b) {\n    if (!b)\n      throw new Error('Assertion failed');\n  };\n\n  var defineProperty = Object.defineProperty;\n  var getOwnPropertyNames = Object.getOwnPropertyNames;\n  var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n  function mixin(to, from) {\n    var names = getOwnPropertyNames(from);\n    for (var i = 0; i < names.length; i++) {\n      var name = names[i];\n      defineProperty(to, name, getOwnPropertyDescriptor(from, name));\n    }\n    return to;\n  };\n\n  function mixinStatics(to, from) {\n    var names = getOwnPropertyNames(from);\n    for (var i = 0; i < names.length; i++) {\n      var name = names[i];\n      switch (name) {\n        case 'arguments':\n        case 'caller':\n        case 'length':\n        case 'name':\n        case 'prototype':\n        case 'toString':\n          continue;\n      }\n      defineProperty(to, name, getOwnPropertyDescriptor(from, name));\n    }\n    return to;\n  };\n\n  function oneOf(object, propertyNames) {\n    for (var i = 0; i < propertyNames.length; i++) {\n      if (propertyNames[i] in object)\n        return propertyNames[i];\n    }\n  }\n\n  var nonEnumerableDataDescriptor = {\n    value: undefined,\n    configurable: true,\n    enumerable: false,\n    writable: true\n  };\n\n  function defineNonEnumerableDataProperty(object, name, value) {\n    nonEnumerableDataDescriptor.value = value;\n    defineProperty(object, name, nonEnumerableDataDescriptor);\n  }\n\n  // Mozilla's old DOM bindings are bretty busted:\n  // https://bugzilla.mozilla.org/show_bug.cgi?id=855844\n  // Make sure they are create before we start modifying things.\n  getOwnPropertyNames(window);\n\n  function getWrapperConstructor(node) {\n    var nativePrototype = node.__proto__ || Object.getPrototypeOf(node);\n    var wrapperConstructor = constructorTable.get(nativePrototype);\n    if (wrapperConstructor)\n      return wrapperConstructor;\n\n    var parentWrapperConstructor = getWrapperConstructor(nativePrototype);\n\n    var GeneratedWrapper = createWrapperConstructor(parentWrapperConstructor);\n    registerInternal(nativePrototype, GeneratedWrapper, node);\n\n    return GeneratedWrapper;\n  }\n\n  function addForwardingProperties(nativePrototype, wrapperPrototype) {\n    installProperty(nativePrototype, wrapperPrototype, true);\n  }\n\n  function registerInstanceProperties(wrapperPrototype, instanceObject) {\n    installProperty(instanceObject, wrapperPrototype, false);\n  }\n\n  var isFirefox = /Firefox/.test(navigator.userAgent);\n\n  // This is used as a fallback when getting the descriptor fails in\n  // installProperty.\n  var dummyDescriptor = {\n    get: function() {},\n    set: function(v) {},\n    configurable: true,\n    enumerable: true\n  };\n\n  function isEventHandlerName(name) {\n    return /^on[a-z]+$/.test(name);\n  }\n\n  function isIdentifierName(name) {\n    return /^\\w[a-zA-Z_0-9]*$/.test(name);\n  }\n\n  function getGetter(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('return this.impl.' + name) :\n        function() { return this.impl[name]; };\n  }\n\n  function getSetter(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('v', 'this.impl.' + name + ' = v') :\n        function(v) { this.impl[name] = v; };\n  }\n\n  function getMethod(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('return this.impl.' + name +\n                     '.apply(this.impl, arguments)') :\n        function() { return this.impl[name].apply(this.impl, arguments); };\n  }\n\n  function getDescriptor(source, name) {\n    try {\n      return Object.getOwnPropertyDescriptor(source, name);\n    } catch (ex) {\n      // JSC and V8 both use data properties instead of accessors which can\n      // cause getting the property desciptor to throw an exception.\n      // https://bugs.webkit.org/show_bug.cgi?id=49739\n      return dummyDescriptor;\n    }\n  }\n\n  function installProperty(source, target, allowMethod, opt_blacklist) {\n    var names = getOwnPropertyNames(source);\n    for (var i = 0; i < names.length; i++) {\n      var name = names[i];\n      if (name === 'polymerBlackList_')\n        continue;\n\n      if (name in target)\n        continue;\n\n      if (source.polymerBlackList_ && source.polymerBlackList_[name])\n        continue;\n\n      if (isFirefox) {\n        // Tickle Firefox's old bindings.\n        source.__lookupGetter__(name);\n      }\n      var descriptor = getDescriptor(source, name);\n      var getter, setter;\n      if (allowMethod && typeof descriptor.value === 'function') {\n        target[name] = getMethod(name);\n        continue;\n      }\n\n      var isEvent = isEventHandlerName(name);\n      if (isEvent)\n        getter = scope.getEventHandlerGetter(name);\n      else\n        getter = getGetter(name);\n\n      if (descriptor.writable || descriptor.set) {\n        if (isEvent)\n          setter = scope.getEventHandlerSetter(name);\n        else\n          setter = getSetter(name);\n      }\n\n      defineProperty(target, name, {\n        get: getter,\n        set: setter,\n        configurable: descriptor.configurable,\n        enumerable: descriptor.enumerable\n      });\n    }\n  }\n\n  /**\n   * @param {Function} nativeConstructor\n   * @param {Function} wrapperConstructor\n   * @param {Object=} opt_instance If present, this is used to extract\n   *     properties from an instance object.\n   */\n  function register(nativeConstructor, wrapperConstructor, opt_instance) {\n    var nativePrototype = nativeConstructor.prototype;\n    registerInternal(nativePrototype, wrapperConstructor, opt_instance);\n    mixinStatics(wrapperConstructor, nativeConstructor);\n  }\n\n  function registerInternal(nativePrototype, wrapperConstructor, opt_instance) {\n    var wrapperPrototype = wrapperConstructor.prototype;\n    assert(constructorTable.get(nativePrototype) === undefined);\n\n    constructorTable.set(nativePrototype, wrapperConstructor);\n    nativePrototypeTable.set(wrapperPrototype, nativePrototype);\n\n    addForwardingProperties(nativePrototype, wrapperPrototype);\n    if (opt_instance)\n      registerInstanceProperties(wrapperPrototype, opt_instance);\n\n    defineNonEnumerableDataProperty(\n        wrapperPrototype, 'constructor', wrapperConstructor);\n    // Set it again. Some VMs optimizes objects that are used as prototypes.\n    wrapperConstructor.prototype = wrapperPrototype;\n  }\n\n  function isWrapperFor(wrapperConstructor, nativeConstructor) {\n    return constructorTable.get(nativeConstructor.prototype) ===\n        wrapperConstructor;\n  }\n\n  /**\n   * Creates a generic wrapper constructor based on |object| and its\n   * constructor.\n   * @param {Node} object\n   * @return {Function} The generated constructor.\n   */\n  function registerObject(object) {\n    var nativePrototype = Object.getPrototypeOf(object);\n\n    var superWrapperConstructor = getWrapperConstructor(nativePrototype);\n    var GeneratedWrapper = createWrapperConstructor(superWrapperConstructor);\n    registerInternal(nativePrototype, GeneratedWrapper, object);\n\n    return GeneratedWrapper;\n  }\n\n  function createWrapperConstructor(superWrapperConstructor) {\n    function GeneratedWrapper(node) {\n      superWrapperConstructor.call(this, node);\n    }\n    var p = Object.create(superWrapperConstructor.prototype);\n    p.constructor = GeneratedWrapper;\n    GeneratedWrapper.prototype = p;\n\n    return GeneratedWrapper;\n  }\n\n  var OriginalDOMImplementation = window.DOMImplementation;\n  var OriginalEventTarget = window.EventTarget;\n  var OriginalEvent = window.Event;\n  var OriginalNode = window.Node;\n  var OriginalWindow = window.Window;\n  var OriginalRange = window.Range;\n  var OriginalCanvasRenderingContext2D = window.CanvasRenderingContext2D;\n  var OriginalWebGLRenderingContext = window.WebGLRenderingContext;\n  var OriginalSVGElementInstance = window.SVGElementInstance;\n\n  function isWrapper(object) {\n    return object instanceof wrappers.EventTarget ||\n           object instanceof wrappers.Event ||\n           object instanceof wrappers.Range ||\n           object instanceof wrappers.DOMImplementation ||\n           object instanceof wrappers.CanvasRenderingContext2D ||\n           wrappers.WebGLRenderingContext &&\n               object instanceof wrappers.WebGLRenderingContext;\n  }\n\n  function isNative(object) {\n    return OriginalEventTarget && object instanceof OriginalEventTarget ||\n           object instanceof OriginalNode ||\n           object instanceof OriginalEvent ||\n           object instanceof OriginalWindow ||\n           object instanceof OriginalRange ||\n           object instanceof OriginalDOMImplementation ||\n           object instanceof OriginalCanvasRenderingContext2D ||\n           OriginalWebGLRenderingContext &&\n               object instanceof OriginalWebGLRenderingContext ||\n           OriginalSVGElementInstance &&\n               object instanceof OriginalSVGElementInstance;\n  }\n\n  /**\n   * Wraps a node in a WrapperNode. If there already exists a wrapper for the\n   * |node| that wrapper is returned instead.\n   * @param {Node} node\n   * @return {WrapperNode}\n   */\n  function wrap(impl) {\n    if (impl === null)\n      return null;\n\n    assert(isNative(impl));\n    return impl.polymerWrapper_ ||\n        (impl.polymerWrapper_ = new (getWrapperConstructor(impl))(impl));\n  }\n\n  /**\n   * Unwraps a wrapper and returns the node it is wrapping.\n   * @param {WrapperNode} wrapper\n   * @return {Node}\n   */\n  function unwrap(wrapper) {\n    if (wrapper === null)\n      return null;\n    assert(isWrapper(wrapper));\n    return wrapper.impl;\n  }\n\n  /**\n   * Unwraps object if it is a wrapper.\n   * @param {Object} object\n   * @return {Object} The native implementation object.\n   */\n  function unwrapIfNeeded(object) {\n    return object && isWrapper(object) ? unwrap(object) : object;\n  }\n\n  /**\n   * Wraps object if it is not a wrapper.\n   * @param {Object} object\n   * @return {Object} The wrapper for object.\n   */\n  function wrapIfNeeded(object) {\n    return object && !isWrapper(object) ? wrap(object) : object;\n  }\n\n  /**\n   * Overrides the current wrapper (if any) for node.\n   * @param {Node} node\n   * @param {WrapperNode=} wrapper If left out the wrapper will be created as\n   *     needed next time someone wraps the node.\n   */\n  function rewrap(node, wrapper) {\n    if (wrapper === null)\n      return;\n    assert(isNative(node));\n    assert(wrapper === undefined || isWrapper(wrapper));\n    node.polymerWrapper_ = wrapper;\n  }\n\n  var getterDescriptor = {\n    get: undefined,\n    configurable: true,\n    enumerable: true\n  };\n\n  function defineGetter(constructor, name, getter) {\n    getterDescriptor.get = getter;\n    defineProperty(constructor.prototype, name, getterDescriptor);\n  }\n\n  function defineWrapGetter(constructor, name) {\n    defineGetter(constructor, name, function() {\n      return wrap(this.impl[name]);\n    });\n  }\n\n  /**\n   * Forwards existing methods on the native object to the wrapper methods.\n   * This does not wrap any of the arguments or the return value since the\n   * wrapper implementation already takes care of that.\n   * @param {Array.<Function>} constructors\n   * @parem {Array.<string>} names\n   */\n  function forwardMethodsToWrapper(constructors, names) {\n    constructors.forEach(function(constructor) {\n      names.forEach(function(name) {\n        constructor.prototype[name] = function() {\n          var w = wrapIfNeeded(this);\n          return w[name].apply(w, arguments);\n        };\n      });\n    });\n  }\n\n  scope.assert = assert;\n  scope.constructorTable = constructorTable;\n  scope.defineGetter = defineGetter;\n  scope.defineWrapGetter = defineWrapGetter;\n  scope.forwardMethodsToWrapper = forwardMethodsToWrapper;\n  scope.isWrapper = isWrapper;\n  scope.isWrapperFor = isWrapperFor;\n  scope.mixin = mixin;\n  scope.nativePrototypeTable = nativePrototypeTable;\n  scope.oneOf = oneOf;\n  scope.registerObject = registerObject;\n  scope.registerWrapper = register;\n  scope.rewrap = rewrap;\n  scope.unwrap = unwrap;\n  scope.unwrapIfNeeded = unwrapIfNeeded;\n  scope.wrap = wrap;\n  scope.wrapIfNeeded = wrapIfNeeded;\n  scope.wrappers = wrappers;\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(context) {\n  'use strict';\n\n  var OriginalMutationObserver = window.MutationObserver;\n  var callbacks = [];\n  var pending = false;\n  var timerFunc;\n\n  function handle() {\n    pending = false;\n    var copies = callbacks.slice(0);\n    callbacks = [];\n    for (var i = 0; i < copies.length; i++) {\n      (0, copies[i])();\n    }\n  }\n\n  if (OriginalMutationObserver) {\n    var counter = 1;\n    var observer = new OriginalMutationObserver(handle);\n    var textNode = document.createTextNode(counter);\n    observer.observe(textNode, {characterData: true});\n\n    timerFunc = function() {\n      counter = (counter + 1) % 2;\n      textNode.data = counter;\n    };\n\n  } else {\n    timerFunc = window.setImmediate || window.setTimeout;\n  }\n\n  function setEndOfMicrotask(func) {\n    callbacks.push(func);\n    if (pending)\n      return;\n    pending = true;\n    timerFunc(handle, 0);\n  }\n\n  context.setEndOfMicrotask = setEndOfMicrotask;\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var setEndOfMicrotask = scope.setEndOfMicrotask\n  var wrapIfNeeded = scope.wrapIfNeeded\n  var wrappers = scope.wrappers;\n\n  var registrationsTable = new WeakMap();\n  var globalMutationObservers = [];\n  var isScheduled = false;\n\n  function scheduleCallback(observer) {\n    if (isScheduled)\n      return;\n    setEndOfMicrotask(notifyObservers);\n    isScheduled = true;\n  }\n\n  // http://dom.spec.whatwg.org/#mutation-observers\n  function notifyObservers() {\n    isScheduled = false;\n\n    do {\n      var notifyList = globalMutationObservers.slice();\n      var anyNonEmpty = false;\n      for (var i = 0; i < notifyList.length; i++) {\n        var mo = notifyList[i];\n        var queue = mo.takeRecords();\n        removeTransientObserversFor(mo);\n        if (queue.length) {\n          mo.callback_(queue, mo);\n          anyNonEmpty = true;\n        }\n      }\n    } while (anyNonEmpty);\n  }\n\n  /**\n   * @param {string} type\n   * @param {Node} target\n   * @constructor\n   */\n  function MutationRecord(type, target) {\n    this.type = type;\n    this.target = target;\n    this.addedNodes = new wrappers.NodeList();\n    this.removedNodes = new wrappers.NodeList();\n    this.previousSibling = null;\n    this.nextSibling = null;\n    this.attributeName = null;\n    this.attributeNamespace = null;\n    this.oldValue = null;\n  }\n\n  /**\n   * Registers transient observers to ancestor and its ancesors for the node\n   * which was removed.\n   * @param {!Node} ancestor\n   * @param {!Node} node\n   */\n  function registerTransientObservers(ancestor, node) {\n    for (; ancestor; ancestor = ancestor.parentNode) {\n      var registrations = registrationsTable.get(ancestor);\n      if (!registrations)\n        continue;\n      for (var i = 0; i < registrations.length; i++) {\n        var registration = registrations[i];\n        if (registration.options.subtree)\n          registration.addTransientObserver(node);\n      }\n    }\n  }\n\n  function removeTransientObserversFor(observer) {\n    for (var i = 0; i < observer.nodes_.length; i++) {\n      var node = observer.nodes_[i];\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        return;\n      for (var j = 0; j < registrations.length; j++) {\n        var registration = registrations[j];\n        if (registration.observer === observer)\n          registration.removeTransientObservers();\n      }\n    }\n  }\n\n  // http://dom.spec.whatwg.org/#queue-a-mutation-record\n  function enqueueMutation(target, type, data) {\n    // 1.\n    var interestedObservers = Object.create(null);\n    var associatedStrings = Object.create(null);\n\n    // 2.\n    for (var node = target; node; node = node.parentNode) {\n      // 3.\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        continue;\n      for (var j = 0; j < registrations.length; j++) {\n        var registration = registrations[j];\n        var options = registration.options;\n        // 1.\n        if (node !== target && !options.subtree)\n          continue;\n\n        // 2.\n        if (type === 'attributes' && !options.attributes)\n          continue;\n\n        // 3. If type is \"attributes\", options's attributeFilter is present, and\n        // either options's attributeFilter does not contain name or namespace\n        // is non-null, continue.\n        if (type === 'attributes' && options.attributeFilter &&\n            (data.namespace !== null ||\n             options.attributeFilter.indexOf(data.name) === -1)) {\n          continue;\n        }\n\n        // 4.\n        if (type === 'characterData' && !options.characterData)\n          continue;\n\n        // 5.\n        if (type === 'childList' && !options.childList)\n          continue;\n\n        // 6.\n        var observer = registration.observer;\n        interestedObservers[observer.uid_] = observer;\n\n        // 7. If either type is \"attributes\" and options's attributeOldValue is\n        // true, or type is \"characterData\" and options's characterDataOldValue\n        // is true, set the paired string of registered observer's observer in\n        // interested observers to oldValue.\n        if (type === 'attributes' && options.attributeOldValue ||\n            type === 'characterData' && options.characterDataOldValue) {\n          associatedStrings[observer.uid_] = data.oldValue;\n        }\n      }\n    }\n\n    var anyRecordsEnqueued = false;\n\n    // 4.\n    for (var uid in interestedObservers) {\n      var observer = interestedObservers[uid];\n      var record = new MutationRecord(type, target);\n\n      // 2.\n      if ('name' in data && 'namespace' in data) {\n        record.attributeName = data.name;\n        record.attributeNamespace = data.namespace;\n      }\n\n      // 3.\n      if (data.addedNodes)\n        record.addedNodes = data.addedNodes;\n\n      // 4.\n      if (data.removedNodes)\n        record.removedNodes = data.removedNodes;\n\n      // 5.\n      if (data.previousSibling)\n        record.previousSibling = data.previousSibling;\n\n      // 6.\n      if (data.nextSibling)\n        record.nextSibling = data.nextSibling;\n\n      // 7.\n      if (associatedStrings[uid] !== undefined)\n        record.oldValue = associatedStrings[uid];\n\n      // 8.\n      observer.records_.push(record);\n\n      anyRecordsEnqueued = true;\n    }\n\n    if (anyRecordsEnqueued)\n      scheduleCallback();\n  }\n\n  var slice = Array.prototype.slice;\n\n  /**\n   * @param {!Object} options\n   * @constructor\n   */\n  function MutationObserverOptions(options) {\n    this.childList = !!options.childList;\n    this.subtree = !!options.subtree;\n\n    // 1. If either options' attributeOldValue or attributeFilter is present\n    // and options' attributes is omitted, set options' attributes to true.\n    if (!('attributes' in options) &&\n        ('attributeOldValue' in options || 'attributeFilter' in options)) {\n      this.attributes = true;\n    } else {\n      this.attributes = !!options.attributes;\n    }\n\n    // 2. If options' characterDataOldValue is present and options'\n    // characterData is omitted, set options' characterData to true.\n    if ('characterDataOldValue' in options && !('characterData' in options))\n      this.characterData = true;\n    else\n      this.characterData = !!options.characterData;\n\n    // 3. & 4.\n    if (!this.attributes &&\n        (options.attributeOldValue || 'attributeFilter' in options) ||\n        // 5.\n        !this.characterData && options.characterDataOldValue) {\n      throw new TypeError();\n    }\n\n    this.characterData = !!options.characterData;\n    this.attributeOldValue = !!options.attributeOldValue;\n    this.characterDataOldValue = !!options.characterDataOldValue;\n    if ('attributeFilter' in options) {\n      if (options.attributeFilter == null ||\n          typeof options.attributeFilter !== 'object') {\n        throw new TypeError();\n      }\n      this.attributeFilter = slice.call(options.attributeFilter);\n    } else {\n      this.attributeFilter = null;\n    }\n  }\n\n  var uidCounter = 0;\n\n  /**\n   * The class that maps to the DOM MutationObserver interface.\n   * @param {Function} callback.\n   * @constructor\n   */\n  function MutationObserver(callback) {\n    this.callback_ = callback;\n    this.nodes_ = [];\n    this.records_ = [];\n    this.uid_ = ++uidCounter;\n\n    // This will leak. There is no way to implement this without WeakRefs :'(\n    globalMutationObservers.push(this);\n  }\n\n  MutationObserver.prototype = {\n    // http://dom.spec.whatwg.org/#dom-mutationobserver-observe\n    observe: function(target, options) {\n      target = wrapIfNeeded(target);\n\n      var newOptions = new MutationObserverOptions(options);\n\n      // 6.\n      var registration;\n      var registrations = registrationsTable.get(target);\n      if (!registrations)\n        registrationsTable.set(target, registrations = []);\n\n      for (var i = 0; i < registrations.length; i++) {\n        if (registrations[i].observer === this) {\n          registration = registrations[i];\n          // 6.1.\n          registration.removeTransientObservers();\n          // 6.2.\n          registration.options = newOptions;\n        }\n      }\n\n      // 7.\n      if (!registration) {\n        registration = new Registration(this, target, newOptions);\n        registrations.push(registration);\n        this.nodes_.push(target);\n      }\n    },\n\n    // http://dom.spec.whatwg.org/#dom-mutationobserver-disconnect\n    disconnect: function() {\n      this.nodes_.forEach(function(node) {\n        var registrations = registrationsTable.get(node);\n        for (var i = 0; i < registrations.length; i++) {\n          var registration = registrations[i];\n          if (registration.observer === this) {\n            registrations.splice(i, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }, this);\n      this.records_ = [];\n    },\n\n    takeRecords: function() {\n      var copyOfRecords = this.records_;\n      this.records_ = [];\n      return copyOfRecords;\n    }\n  };\n\n  /**\n   * Class used to represent a registered observer.\n   * @param {MutationObserver} observer\n   * @param {Node} target\n   * @param {MutationObserverOptions} options\n   * @constructor\n   */\n  function Registration(observer, target, options) {\n    this.observer = observer;\n    this.target = target;\n    this.options = options;\n    this.transientObservedNodes = [];\n  }\n\n  Registration.prototype = {\n    /**\n     * Adds a transient observer on node. The transient observer gets removed\n     * next time we deliver the change records.\n     * @param {Node} node\n     */\n    addTransientObserver: function(node) {\n      // Don't add transient observers on the target itself. We already have all\n      // the required listeners set up on the target.\n      if (node === this.target)\n        return;\n\n      this.transientObservedNodes.push(node);\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        registrationsTable.set(node, registrations = []);\n\n      // We know that registrations does not contain this because we already\n      // checked if node === this.target.\n      registrations.push(this);\n    },\n\n    removeTransientObservers: function() {\n      var transientObservedNodes = this.transientObservedNodes;\n      this.transientObservedNodes = [];\n\n      for (var i = 0; i < transientObservedNodes.length; i++) {\n        var node = transientObservedNodes[i];\n        var registrations = registrationsTable.get(node);\n        for (var j = 0; j < registrations.length; j++) {\n          if (registrations[j] === this) {\n            registrations.splice(j, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }\n    }\n  };\n\n  scope.enqueueMutation = enqueueMutation;\n  scope.registerTransientObservers = registerTransientObservers;\n  scope.wrappers.MutationObserver = MutationObserver;\n  scope.wrappers.MutationRecord = MutationRecord;\n\n})(window.ShadowDOMPolyfill);\n","/**\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  /**\n   * A tree scope represents the root of a tree. All nodes in a tree point to\n   * the same TreeScope object. The tree scope of a node get set the first time\n   * it is accessed or when a node is added or remove to a tree.\n   * @constructor\n   */\n  function TreeScope(root, parent) {\n    this.root = root;\n    this.parent = parent;\n  }\n\n  TreeScope.prototype = {\n    get renderer() {\n      if (this.root instanceof scope.wrappers.ShadowRoot) {\n        return scope.getRendererForHost(this.root.host);\n      }\n      return null;\n    },\n\n    contains: function(treeScope) {\n      for (; treeScope; treeScope = treeScope.parent) {\n        if (treeScope === this)\n          return true;\n      }\n      return false;\n    }\n  };\n\n  function setTreeScope(node, treeScope) {\n    if (node.treeScope_ !== treeScope) {\n      node.treeScope_ = treeScope;\n      for (var sr = node.shadowRoot; sr; sr = sr.olderShadowRoot) {\n        sr.treeScope_.parent = treeScope;\n      }\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        setTreeScope(child, treeScope);\n      }\n    }\n  }\n\n  function getTreeScope(node) {\n    if (node.treeScope_)\n      return node.treeScope_;\n    var parent = node.parentNode;\n    var treeScope;\n    if (parent)\n      treeScope = getTreeScope(parent);\n    else\n      treeScope = new TreeScope(node, null);\n    return node.treeScope_ = treeScope;\n  }\n\n  scope.TreeScope = TreeScope;\n  scope.getTreeScope = getTreeScope;\n  scope.setTreeScope = setTreeScope;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var forwardMethodsToWrapper = scope.forwardMethodsToWrapper;\n  var getTreeScope = scope.getTreeScope;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrappers = scope.wrappers;\n\n  var wrappedFuns = new WeakMap();\n  var listenersTable = new WeakMap();\n  var handledEventsTable = new WeakMap();\n  var currentlyDispatchingEvents = new WeakMap();\n  var targetTable = new WeakMap();\n  var currentTargetTable = new WeakMap();\n  var relatedTargetTable = new WeakMap();\n  var eventPhaseTable = new WeakMap();\n  var stopPropagationTable = new WeakMap();\n  var stopImmediatePropagationTable = new WeakMap();\n  var eventHandlersTable = new WeakMap();\n  var eventPathTable = new WeakMap();\n\n  function isShadowRoot(node) {\n    return node instanceof wrappers.ShadowRoot;\n  }\n\n  function isInsertionPoint(node) {\n    var localName = node.localName;\n    return localName === 'content' || localName === 'shadow';\n  }\n\n  function isShadowHost(node) {\n    return !!node.shadowRoot;\n  }\n\n  function getEventParent(node) {\n    var dv;\n    return node.parentNode || (dv = node.defaultView) && wrap(dv) || null;\n  }\n\n  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#dfn-adjusted-parent\n  function calculateParents(node, context, ancestors) {\n    if (ancestors.length)\n      return ancestors.shift();\n\n    // 1.\n    if (isShadowRoot(node))\n      return getInsertionParent(node) || node.host;\n\n    // 2.\n    var eventParents = scope.eventParentsTable.get(node);\n    if (eventParents) {\n      // Copy over the remaining event parents for next iteration.\n      for (var i = 1; i < eventParents.length; i++) {\n        ancestors[i - 1] = eventParents[i];\n      }\n      return eventParents[0];\n    }\n\n    // 3.\n    if (context && isInsertionPoint(node)) {\n      var parentNode = node.parentNode;\n      if (parentNode && isShadowHost(parentNode)) {\n        var trees = scope.getShadowTrees(parentNode);\n        var p = getInsertionParent(context);\n        for (var i = 0; i < trees.length; i++) {\n          if (trees[i].contains(p))\n            return p;\n        }\n      }\n    }\n\n    return getEventParent(node);\n  }\n\n  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#event-retargeting\n  function retarget(node) {\n    var stack = [];  // 1.\n    var ancestor = node;  // 2.\n    var targets = [];\n    var ancestors = [];\n    while (ancestor) {  // 3.\n      var context = null;  // 3.2.\n      // TODO(arv): Change order of these. If the stack is empty we always end\n      // up pushing ancestor, no matter what.\n      if (isInsertionPoint(ancestor)) {  // 3.1.\n        context = topMostNotInsertionPoint(stack);  // 3.1.1.\n        var top = stack[stack.length - 1] || ancestor;  // 3.1.2.\n        stack.push(top);\n      } else if (!stack.length) {\n        stack.push(ancestor);  // 3.3.\n      }\n      var target = stack[stack.length - 1];  // 3.4.\n      targets.push({target: target, currentTarget: ancestor});  // 3.5.\n      if (isShadowRoot(ancestor))  // 3.6.\n        stack.pop();  // 3.6.1.\n\n      ancestor = calculateParents(ancestor, context, ancestors);  // 3.7.\n    }\n    return targets;\n  }\n\n  function topMostNotInsertionPoint(stack) {\n    for (var i = stack.length - 1; i >= 0; i--) {\n      if (!isInsertionPoint(stack[i]))\n        return stack[i];\n    }\n    return null;\n  }\n\n  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#dfn-adjusted-related-target\n  function adjustRelatedTarget(target, related) {\n    var ancestors = [];\n    while (target) {  // 3.\n      var stack = [];  // 3.1.\n      var ancestor = related;  // 3.2.\n      var last = undefined;  // 3.3. Needs to be reset every iteration.\n      while (ancestor) {\n        var context = null;\n        if (!stack.length) {\n          stack.push(ancestor);\n        } else {\n          if (isInsertionPoint(ancestor)) {  // 3.4.3.\n            context = topMostNotInsertionPoint(stack);\n            // isDistributed is more general than checking whether last is\n            // assigned into ancestor.\n            if (isDistributed(last)) {  // 3.4.3.2.\n              var head = stack[stack.length - 1];\n              stack.push(head);\n            }\n          }\n        }\n\n        if (inSameTree(ancestor, target))  // 3.4.4.\n          return stack[stack.length - 1];\n\n        if (isShadowRoot(ancestor))  // 3.4.5.\n          stack.pop();\n\n        last = ancestor;  // 3.4.6.\n        ancestor = calculateParents(ancestor, context, ancestors);  // 3.4.7.\n      }\n      if (isShadowRoot(target))  // 3.5.\n        target = target.host;\n      else\n        target = target.parentNode;  // 3.6.\n    }\n  }\n\n  function getInsertionParent(node) {\n    return scope.insertionParentTable.get(node);\n  }\n\n  function isDistributed(node) {\n    return getInsertionParent(node);\n  }\n\n  function inSameTree(a, b) {\n    return getTreeScope(a) === getTreeScope(b);\n  }\n\n  // pendingError is used to rethrow the first error we got during an event\n  // dispatch. The browser actually reports all errors but to do that we would\n  // need to rethrow the error asynchronously.\n  var pendingError;\n\n  function dispatchOriginalEvent(originalEvent) {\n    // Make sure this event is only dispatched once.\n    if (handledEventsTable.get(originalEvent))\n      return;\n    handledEventsTable.set(originalEvent, true);\n    dispatchEvent(wrap(originalEvent), wrap(originalEvent.target));\n    if (pendingError) {\n      var err = pendingError;\n      pendingError = null;\n      throw err;\n    }\n  }\n\n  function isLoadLikeEvent(event) {\n    switch (event.type) {\n      case 'beforeunload':\n      case 'load':\n      case 'unload':\n        return true;\n    }\n    return false;\n  }\n\n  function dispatchEvent(event, originalWrapperTarget) {\n    if (currentlyDispatchingEvents.get(event))\n      throw new Error('InvalidStateError')\n    currentlyDispatchingEvents.set(event, true);\n\n    // Render to ensure that the event path is correct.\n    scope.renderAllPending();\n    var eventPath = retarget(originalWrapperTarget);\n\n    // For window \"load\" events the \"load\" event is dispatched at the window but\n    // the target is set to the document.\n    //\n    // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#the-end\n    //\n    // TODO(arv): Find a less hacky way to do this.\n    if (eventPath.length === 2 &&\n        eventPath[0].target instanceof wrappers.Document &&\n        isLoadLikeEvent(event)) {\n      eventPath.shift();\n    }\n\n    eventPathTable.set(event, eventPath);\n\n    if (dispatchCapturing(event, eventPath)) {\n      if (dispatchAtTarget(event, eventPath)) {\n        dispatchBubbling(event, eventPath);\n      }\n    }\n\n    eventPhaseTable.set(event, Event.NONE);\n    currentTargetTable.delete(event, null);\n    currentlyDispatchingEvents.delete(event);\n\n    return event.defaultPrevented;\n  }\n\n  function dispatchCapturing(event, eventPath) {\n    var phase;\n\n    for (var i = eventPath.length - 1; i > 0; i--) {\n      var target = eventPath[i].target;\n      var currentTarget = eventPath[i].currentTarget;\n      if (target === currentTarget)\n        continue;\n\n      phase = Event.CAPTURING_PHASE;\n      if (!invoke(eventPath[i], event, phase))\n        return false;\n    }\n\n    return true;\n  }\n\n  function dispatchAtTarget(event, eventPath) {\n    var phase = Event.AT_TARGET;\n    return invoke(eventPath[0], event, phase);\n  }\n\n  function dispatchBubbling(event, eventPath) {\n    var bubbles = event.bubbles;\n    var phase;\n\n    for (var i = 1; i < eventPath.length; i++) {\n      var target = eventPath[i].target;\n      var currentTarget = eventPath[i].currentTarget;\n      if (target === currentTarget)\n        phase = Event.AT_TARGET;\n      else if (bubbles && !stopImmediatePropagationTable.get(event))\n        phase = Event.BUBBLING_PHASE;\n      else\n        continue;\n\n      if (!invoke(eventPath[i], event, phase))\n        return;\n    }\n  }\n\n  function invoke(tuple, event, phase) {\n    var target = tuple.target;\n    var currentTarget = tuple.currentTarget;\n\n    var listeners = listenersTable.get(currentTarget);\n    if (!listeners)\n      return true;\n\n    if ('relatedTarget' in event) {\n      var originalEvent = unwrap(event);\n      var unwrappedRelatedTarget = originalEvent.relatedTarget;\n\n      // X-Tag sets relatedTarget on a CustomEvent. If they do that there is no\n      // way to have relatedTarget return the adjusted target but worse is that\n      // the originalEvent might not have a relatedTarget so we hit an assert\n      // when we try to wrap it.\n      if (unwrappedRelatedTarget) {\n        // In IE we can get objects that are not EventTargets at this point.\n        // Safari does not have an EventTarget interface so revert to checking\n        // for addEventListener as an approximation.\n        if (unwrappedRelatedTarget instanceof Object &&\n            unwrappedRelatedTarget.addEventListener) {\n          var relatedTarget = wrap(unwrappedRelatedTarget);\n\n          var adjusted = adjustRelatedTarget(currentTarget, relatedTarget);\n          if (adjusted === target)\n            return true;\n        } else {\n          adjusted = null;\n        }\n        relatedTargetTable.set(event, adjusted);\n      }\n    }\n\n    eventPhaseTable.set(event, phase);\n    var type = event.type;\n\n    var anyRemoved = false;\n    targetTable.set(event, target);\n    currentTargetTable.set(event, currentTarget);\n\n    for (var i = 0; i < listeners.length; i++) {\n      var listener = listeners[i];\n      if (listener.removed) {\n        anyRemoved = true;\n        continue;\n      }\n\n      if (listener.type !== type ||\n          !listener.capture && phase === Event.CAPTURING_PHASE ||\n          listener.capture && phase === Event.BUBBLING_PHASE) {\n        continue;\n      }\n\n      try {\n        if (typeof listener.handler === 'function')\n          listener.handler.call(currentTarget, event);\n        else\n          listener.handler.handleEvent(event);\n\n        if (stopImmediatePropagationTable.get(event))\n          return false;\n\n      } catch (ex) {\n        if (!pendingError)\n          pendingError = ex;\n      }\n    }\n\n    if (anyRemoved) {\n      var copy = listeners.slice();\n      listeners.length = 0;\n      for (var i = 0; i < copy.length; i++) {\n        if (!copy[i].removed)\n          listeners.push(copy[i]);\n      }\n    }\n\n    return !stopPropagationTable.get(event);\n  }\n\n  function Listener(type, handler, capture) {\n    this.type = type;\n    this.handler = handler;\n    this.capture = Boolean(capture);\n  }\n  Listener.prototype = {\n    equals: function(that) {\n      return this.handler === that.handler && this.type === that.type &&\n          this.capture === that.capture;\n    },\n    get removed() {\n      return this.handler === null;\n    },\n    remove: function() {\n      this.handler = null;\n    }\n  };\n\n  var OriginalEvent = window.Event;\n  OriginalEvent.prototype.polymerBlackList_ = {\n    returnValue: true,\n    // TODO(arv): keyLocation is part of KeyboardEvent but Firefox does not\n    // support constructable KeyboardEvent so we keep it here for now.\n    keyLocation: true\n  };\n\n  /**\n   * Creates a new Event wrapper or wraps an existin native Event object.\n   * @param {string|Event} type\n   * @param {Object=} options\n   * @constructor\n   */\n  function Event(type, options) {\n    if (type instanceof OriginalEvent) {\n      var impl = type;\n      if (!OriginalBeforeUnloadEvent && impl.type === 'beforeunload')\n        return new BeforeUnloadEvent(impl);\n      this.impl = impl;\n    } else {\n      return wrap(constructEvent(OriginalEvent, 'Event', type, options));\n    }\n  }\n  Event.prototype = {\n    get target() {\n      return targetTable.get(this);\n    },\n    get currentTarget() {\n      return currentTargetTable.get(this);\n    },\n    get eventPhase() {\n      return eventPhaseTable.get(this);\n    },\n    get path() {\n      var nodeList = new wrappers.NodeList();\n      var eventPath = eventPathTable.get(this);\n      if (eventPath) {\n        var index = 0;\n        var lastIndex = eventPath.length - 1;\n        var baseRoot = getTreeScope(currentTargetTable.get(this));\n\n        for (var i = 0; i <= lastIndex; i++) {\n          var currentTarget = eventPath[i].currentTarget;\n          var currentRoot = getTreeScope(currentTarget);\n          if (currentRoot.contains(baseRoot) &&\n              // Make sure we do not add Window to the path.\n              (i !== lastIndex || currentTarget instanceof wrappers.Node)) {\n            nodeList[index++] = currentTarget;\n          }\n        }\n        nodeList.length = index;\n      }\n      return nodeList;\n    },\n    stopPropagation: function() {\n      stopPropagationTable.set(this, true);\n    },\n    stopImmediatePropagation: function() {\n      stopPropagationTable.set(this, true);\n      stopImmediatePropagationTable.set(this, true);\n    }\n  };\n  registerWrapper(OriginalEvent, Event, document.createEvent('Event'));\n\n  function unwrapOptions(options) {\n    if (!options || !options.relatedTarget)\n      return options;\n    return Object.create(options, {\n      relatedTarget: {value: unwrap(options.relatedTarget)}\n    });\n  }\n\n  function registerGenericEvent(name, SuperEvent, prototype) {\n    var OriginalEvent = window[name];\n    var GenericEvent = function(type, options) {\n      if (type instanceof OriginalEvent)\n        this.impl = type;\n      else\n        return wrap(constructEvent(OriginalEvent, name, type, options));\n    };\n    GenericEvent.prototype = Object.create(SuperEvent.prototype);\n    if (prototype)\n      mixin(GenericEvent.prototype, prototype);\n    if (OriginalEvent) {\n      // - Old versions of Safari fails on new FocusEvent (and others?).\n      // - IE does not support event constructors.\n      // - createEvent('FocusEvent') throws in Firefox.\n      // => Try the best practice solution first and fallback to the old way\n      // if needed.\n      try {\n        registerWrapper(OriginalEvent, GenericEvent, new OriginalEvent('temp'));\n      } catch (ex) {\n        registerWrapper(OriginalEvent, GenericEvent,\n                        document.createEvent(name));\n      }\n    }\n    return GenericEvent;\n  }\n\n  var UIEvent = registerGenericEvent('UIEvent', Event);\n  var CustomEvent = registerGenericEvent('CustomEvent', Event);\n\n  var relatedTargetProto = {\n    get relatedTarget() {\n      var relatedTarget = relatedTargetTable.get(this);\n      // relatedTarget can be null.\n      if (relatedTarget !== undefined)\n        return relatedTarget;\n      return wrap(unwrap(this).relatedTarget);\n    }\n  };\n\n  function getInitFunction(name, relatedTargetIndex) {\n    return function() {\n      arguments[relatedTargetIndex] = unwrap(arguments[relatedTargetIndex]);\n      var impl = unwrap(this);\n      impl[name].apply(impl, arguments);\n    };\n  }\n\n  var mouseEventProto = mixin({\n    initMouseEvent: getInitFunction('initMouseEvent', 14)\n  }, relatedTargetProto);\n\n  var focusEventProto = mixin({\n    initFocusEvent: getInitFunction('initFocusEvent', 5)\n  }, relatedTargetProto);\n\n  var MouseEvent = registerGenericEvent('MouseEvent', UIEvent, mouseEventProto);\n  var FocusEvent = registerGenericEvent('FocusEvent', UIEvent, focusEventProto);\n\n  // In case the browser does not support event constructors we polyfill that\n  // by calling `createEvent('Foo')` and `initFooEvent` where the arguments to\n  // `initFooEvent` are derived from the registered default event init dict.\n  var defaultInitDicts = Object.create(null);\n\n  var supportsEventConstructors = (function() {\n    try {\n      new window.FocusEvent('focus');\n    } catch (ex) {\n      return false;\n    }\n    return true;\n  })();\n\n  /**\n   * Constructs a new native event.\n   */\n  function constructEvent(OriginalEvent, name, type, options) {\n    if (supportsEventConstructors)\n      return new OriginalEvent(type, unwrapOptions(options));\n\n    // Create the arguments from the default dictionary.\n    var event = unwrap(document.createEvent(name));\n    var defaultDict = defaultInitDicts[name];\n    var args = [type];\n    Object.keys(defaultDict).forEach(function(key) {\n      var v = options != null && key in options ?\n          options[key] : defaultDict[key];\n      if (key === 'relatedTarget')\n        v = unwrap(v);\n      args.push(v);\n    });\n    event['init' + name].apply(event, args);\n    return event;\n  }\n\n  if (!supportsEventConstructors) {\n    var configureEventConstructor = function(name, initDict, superName) {\n      if (superName) {\n        var superDict = defaultInitDicts[superName];\n        initDict = mixin(mixin({}, superDict), initDict);\n      }\n\n      defaultInitDicts[name] = initDict;\n    };\n\n    // The order of the default event init dictionary keys is important, the\n    // arguments to initFooEvent is derived from that.\n    configureEventConstructor('Event', {bubbles: false, cancelable: false});\n    configureEventConstructor('CustomEvent', {detail: null}, 'Event');\n    configureEventConstructor('UIEvent', {view: null, detail: 0}, 'Event');\n    configureEventConstructor('MouseEvent', {\n      screenX: 0,\n      screenY: 0,\n      clientX: 0,\n      clientY: 0,\n      ctrlKey: false,\n      altKey: false,\n      shiftKey: false,\n      metaKey: false,\n      button: 0,\n      relatedTarget: null\n    }, 'UIEvent');\n    configureEventConstructor('FocusEvent', {relatedTarget: null}, 'UIEvent');\n  }\n\n  // Safari 7 does not yet have BeforeUnloadEvent.\n  // https://bugs.webkit.org/show_bug.cgi?id=120849\n  var OriginalBeforeUnloadEvent = window.BeforeUnloadEvent;\n\n  function BeforeUnloadEvent(impl) {\n    Event.call(this, impl);\n  }\n  BeforeUnloadEvent.prototype = Object.create(Event.prototype);\n  mixin(BeforeUnloadEvent.prototype, {\n    get returnValue() {\n      return this.impl.returnValue;\n    },\n    set returnValue(v) {\n      this.impl.returnValue = v;\n    }\n  });\n\n  if (OriginalBeforeUnloadEvent)\n    registerWrapper(OriginalBeforeUnloadEvent, BeforeUnloadEvent);\n\n  function isValidListener(fun) {\n    if (typeof fun === 'function')\n      return true;\n    return fun && fun.handleEvent;\n  }\n\n  function isMutationEvent(type) {\n    switch (type) {\n      case 'DOMAttrModified':\n      case 'DOMAttributeNameChanged':\n      case 'DOMCharacterDataModified':\n      case 'DOMElementNameChanged':\n      case 'DOMNodeInserted':\n      case 'DOMNodeInsertedIntoDocument':\n      case 'DOMNodeRemoved':\n      case 'DOMNodeRemovedFromDocument':\n      case 'DOMSubtreeModified':\n        return true;\n    }\n    return false;\n  }\n\n  var OriginalEventTarget = window.EventTarget;\n\n  /**\n   * This represents a wrapper for an EventTarget.\n   * @param {!EventTarget} impl The original event target.\n   * @constructor\n   */\n  function EventTarget(impl) {\n    this.impl = impl;\n  }\n\n  // Node and Window have different internal type checks in WebKit so we cannot\n  // use the same method as the original function.\n  var methodNames = [\n    'addEventListener',\n    'removeEventListener',\n    'dispatchEvent'\n  ];\n\n  [Node, Window].forEach(function(constructor) {\n    var p = constructor.prototype;\n    methodNames.forEach(function(name) {\n      Object.defineProperty(p, name + '_', {value: p[name]});\n    });\n  });\n\n  function getTargetToListenAt(wrapper) {\n    if (wrapper instanceof wrappers.ShadowRoot)\n      wrapper = wrapper.host;\n    return unwrap(wrapper);\n  }\n\n  EventTarget.prototype = {\n    addEventListener: function(type, fun, capture) {\n      if (!isValidListener(fun) || isMutationEvent(type))\n        return;\n\n      var listener = new Listener(type, fun, capture);\n      var listeners = listenersTable.get(this);\n      if (!listeners) {\n        listeners = [];\n        listenersTable.set(this, listeners);\n      } else {\n        // Might have a duplicate.\n        for (var i = 0; i < listeners.length; i++) {\n          if (listener.equals(listeners[i]))\n            return;\n        }\n      }\n\n      listeners.push(listener);\n\n      var target = getTargetToListenAt(this);\n      target.addEventListener_(type, dispatchOriginalEvent, true);\n    },\n    removeEventListener: function(type, fun, capture) {\n      capture = Boolean(capture);\n      var listeners = listenersTable.get(this);\n      if (!listeners)\n        return;\n      var count = 0, found = false;\n      for (var i = 0; i < listeners.length; i++) {\n        if (listeners[i].type === type && listeners[i].capture === capture) {\n          count++;\n          if (listeners[i].handler === fun) {\n            found = true;\n            listeners[i].remove();\n          }\n        }\n      }\n\n      if (found && count === 1) {\n        var target = getTargetToListenAt(this);\n        target.removeEventListener_(type, dispatchOriginalEvent, true);\n      }\n    },\n    dispatchEvent: function(event) {\n      // We want to use the native dispatchEvent because it triggers the default\n      // actions (like checking a checkbox). However, if there are no listeners\n      // in the composed tree then there are no events that will trigger and\n      // listeners in the non composed tree that are part of the event path are\n      // not notified.\n      //\n      // If we find out that there are no listeners in the composed tree we add\n      // a temporary listener to the target which makes us get called back even\n      // in that case.\n\n      var nativeEvent = unwrap(event);\n      var eventType = nativeEvent.type;\n\n      // Allow dispatching the same event again. This is safe because if user\n      // code calls this during an existing dispatch of the same event the\n      // native dispatchEvent throws (that is required by the spec).\n      handledEventsTable.set(nativeEvent, false);\n\n      // Force rendering since we prefer native dispatch and that works on the\n      // composed tree.\n      scope.renderAllPending();\n\n      var tempListener;\n      if (!hasListenerInAncestors(this, eventType)) {\n        tempListener = function() {};\n        this.addEventListener(eventType, tempListener, true);\n      }\n\n      try {\n        return unwrap(this).dispatchEvent_(nativeEvent);\n      } finally {\n        if (tempListener)\n          this.removeEventListener(eventType, tempListener, true);\n      }\n    }\n  };\n\n  function hasListener(node, type) {\n    var listeners = listenersTable.get(node);\n    if (listeners) {\n      for (var i = 0; i < listeners.length; i++) {\n        if (!listeners[i].removed && listeners[i].type === type)\n          return true;\n      }\n    }\n    return false;\n  }\n\n  function hasListenerInAncestors(target, type) {\n    for (var node = unwrap(target); node; node = node.parentNode) {\n      if (hasListener(wrap(node), type))\n        return true;\n    }\n    return false;\n  }\n\n  if (OriginalEventTarget)\n    registerWrapper(OriginalEventTarget, EventTarget);\n\n  function wrapEventTargetMethods(constructors) {\n    forwardMethodsToWrapper(constructors, methodNames);\n  }\n\n  var originalElementFromPoint = document.elementFromPoint;\n\n  function elementFromPoint(self, document, x, y) {\n    scope.renderAllPending();\n\n    var element = wrap(originalElementFromPoint.call(document.impl, x, y));\n    var targets = retarget(element, this)\n    for (var i = 0; i < targets.length; i++) {\n      var target = targets[i];\n      if (target.currentTarget === self)\n        return target.target;\n    }\n    return null;\n  }\n\n  /**\n   * Returns a function that is to be used as a getter for `onfoo` properties.\n   * @param {string} name\n   * @return {Function}\n   */\n  function getEventHandlerGetter(name) {\n    return function() {\n      var inlineEventHandlers = eventHandlersTable.get(this);\n      return inlineEventHandlers && inlineEventHandlers[name] &&\n          inlineEventHandlers[name].value || null;\n     };\n  }\n\n  /**\n   * Returns a function that is to be used as a setter for `onfoo` properties.\n   * @param {string} name\n   * @return {Function}\n   */\n  function getEventHandlerSetter(name) {\n    var eventType = name.slice(2);\n    return function(value) {\n      var inlineEventHandlers = eventHandlersTable.get(this);\n      if (!inlineEventHandlers) {\n        inlineEventHandlers = Object.create(null);\n        eventHandlersTable.set(this, inlineEventHandlers);\n      }\n\n      var old = inlineEventHandlers[name];\n      if (old)\n        this.removeEventListener(eventType, old.wrapped, false);\n\n      if (typeof value === 'function') {\n        var wrapped = function(e) {\n          var rv = value.call(this, e);\n          if (rv === false)\n            e.preventDefault();\n          else if (name === 'onbeforeunload' && typeof rv === 'string')\n            e.returnValue = rv;\n          // mouseover uses true for preventDefault but preventDefault for\n          // mouseover is ignored by browsers these day.\n        };\n\n        this.addEventListener(eventType, wrapped, false);\n        inlineEventHandlers[name] = {\n          value: value,\n          wrapped: wrapped\n        };\n      }\n    };\n  }\n\n  scope.adjustRelatedTarget = adjustRelatedTarget;\n  scope.elementFromPoint = elementFromPoint;\n  scope.getEventHandlerGetter = getEventHandlerGetter;\n  scope.getEventHandlerSetter = getEventHandlerSetter;\n  scope.wrapEventTargetMethods = wrapEventTargetMethods;\n  scope.wrappers.BeforeUnloadEvent = BeforeUnloadEvent;\n  scope.wrappers.CustomEvent = CustomEvent;\n  scope.wrappers.Event = Event;\n  scope.wrappers.EventTarget = EventTarget;\n  scope.wrappers.FocusEvent = FocusEvent;\n  scope.wrappers.MouseEvent = MouseEvent;\n  scope.wrappers.UIEvent = UIEvent;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2012 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var wrap = scope.wrap;\n\n  var nonEnumDescriptor = {enumerable: false};\n\n  function nonEnum(obj, prop) {\n    Object.defineProperty(obj, prop, nonEnumDescriptor);\n  }\n\n  function NodeList() {\n    this.length = 0;\n    nonEnum(this, 'length');\n  }\n  NodeList.prototype = {\n    item: function(index) {\n      return this[index];\n    }\n  };\n  nonEnum(NodeList.prototype, 'item');\n\n  function wrapNodeList(list) {\n    if (list == null)\n      return list;\n    var wrapperList = new NodeList();\n    for (var i = 0, length = list.length; i < length; i++) {\n      wrapperList[i] = wrap(list[i]);\n    }\n    wrapperList.length = length;\n    return wrapperList;\n  }\n\n  function addWrapNodeListMethod(wrapperConstructor, name) {\n    wrapperConstructor.prototype[name] = function() {\n      return wrapNodeList(this.impl[name].apply(this.impl, arguments));\n    };\n  }\n\n  scope.wrappers.NodeList = NodeList;\n  scope.addWrapNodeListMethod = addWrapNodeListMethod;\n  scope.wrapNodeList = wrapNodeList;\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  // TODO(arv): Implement.\n\n  scope.wrapHTMLCollection = scope.wrapNodeList;\n  scope.wrappers.HTMLCollection = scope.wrappers.NodeList;\n\n})(window.ShadowDOMPolyfill);\n","/**\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var EventTarget = scope.wrappers.EventTarget;\n  var NodeList = scope.wrappers.NodeList;\n  var TreeScope = scope.TreeScope;\n  var assert = scope.assert;\n  var defineWrapGetter = scope.defineWrapGetter;\n  var enqueueMutation = scope.enqueueMutation;\n  var getTreeScope = scope.getTreeScope;\n  var isWrapper = scope.isWrapper;\n  var mixin = scope.mixin;\n  var registerTransientObservers = scope.registerTransientObservers;\n  var registerWrapper = scope.registerWrapper;\n  var setTreeScope = scope.setTreeScope;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n  var wrapIfNeeded = scope.wrapIfNeeded;\n  var wrappers = scope.wrappers;\n\n  function assertIsNodeWrapper(node) {\n    assert(node instanceof Node);\n  }\n\n  function createOneElementNodeList(node) {\n    var nodes = new NodeList();\n    nodes[0] = node;\n    nodes.length = 1;\n    return nodes;\n  }\n\n  var surpressMutations = false;\n\n  /**\n   * Called before node is inserted into a node to enqueue its removal from its\n   * old parent.\n   * @param {!Node} node The node that is about to be removed.\n   * @param {!Node} parent The parent node that the node is being removed from.\n   * @param {!NodeList} nodes The collected nodes.\n   */\n  function enqueueRemovalForInsertedNodes(node, parent, nodes) {\n    enqueueMutation(parent, 'childList', {\n      removedNodes: nodes,\n      previousSibling: node.previousSibling,\n      nextSibling: node.nextSibling\n    });\n  }\n\n  function enqueueRemovalForInsertedDocumentFragment(df, nodes) {\n    enqueueMutation(df, 'childList', {\n      removedNodes: nodes\n    });\n  }\n\n  /**\n   * Collects nodes from a DocumentFragment or a Node for removal followed\n   * by an insertion.\n   *\n   * This updates the internal pointers for node, previousNode and nextNode.\n   */\n  function collectNodes(node, parentNode, previousNode, nextNode) {\n    if (node instanceof DocumentFragment) {\n      var nodes = collectNodesForDocumentFragment(node);\n\n      // The extra loop is to work around bugs with DocumentFragments in IE.\n      surpressMutations = true;\n      for (var i = nodes.length - 1; i >= 0; i--) {\n        node.removeChild(nodes[i]);\n        nodes[i].parentNode_ = parentNode;\n      }\n      surpressMutations = false;\n\n      for (var i = 0; i < nodes.length; i++) {\n        nodes[i].previousSibling_ = nodes[i - 1] || previousNode;\n        nodes[i].nextSibling_ = nodes[i + 1] || nextNode;\n      }\n\n      if (previousNode)\n        previousNode.nextSibling_ = nodes[0];\n      if (nextNode)\n        nextNode.previousSibling_ = nodes[nodes.length - 1];\n\n      return nodes;\n    }\n\n    var nodes = createOneElementNodeList(node);\n    var oldParent = node.parentNode;\n    if (oldParent) {\n      // This will enqueue the mutation record for the removal as needed.\n      oldParent.removeChild(node);\n    }\n\n    node.parentNode_ = parentNode;\n    node.previousSibling_ = previousNode;\n    node.nextSibling_ = nextNode;\n    if (previousNode)\n      previousNode.nextSibling_ = node;\n    if (nextNode)\n      nextNode.previousSibling_ = node;\n\n    return nodes;\n  }\n\n  function collectNodesNative(node) {\n    if (node instanceof DocumentFragment)\n      return collectNodesForDocumentFragment(node);\n\n    var nodes = createOneElementNodeList(node);\n    var oldParent = node.parentNode;\n    if (oldParent)\n      enqueueRemovalForInsertedNodes(node, oldParent, nodes);\n    return nodes;\n  }\n\n  function collectNodesForDocumentFragment(node) {\n    var nodes = new NodeList();\n    var i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      nodes[i++] = child;\n    }\n    nodes.length = i;\n    enqueueRemovalForInsertedDocumentFragment(node, nodes);\n    return nodes;\n  }\n\n  function snapshotNodeList(nodeList) {\n    // NodeLists are not live at the moment so just return the same object.\n    return nodeList;\n  }\n\n  // http://dom.spec.whatwg.org/#node-is-inserted\n  function nodeWasAdded(node, treeScope) {\n    setTreeScope(node, treeScope);\n    node.nodeIsInserted_();\n  }\n\n  function nodesWereAdded(nodes, parent) {\n    var treeScope = getTreeScope(parent);\n    for (var i = 0; i < nodes.length; i++) {\n      nodeWasAdded(nodes[i], treeScope);\n    }\n  }\n\n  // http://dom.spec.whatwg.org/#node-is-removed\n  function nodeWasRemoved(node) {\n    setTreeScope(node, new TreeScope(node, null));\n  }\n\n  function nodesWereRemoved(nodes) {\n    for (var i = 0; i < nodes.length; i++) {\n      nodeWasRemoved(nodes[i]);\n    }\n  }\n\n  function ensureSameOwnerDocument(parent, child) {\n    var ownerDoc = parent.nodeType === Node.DOCUMENT_NODE ?\n        parent : parent.ownerDocument;\n    if (ownerDoc !== child.ownerDocument)\n      ownerDoc.adoptNode(child);\n  }\n\n  function adoptNodesIfNeeded(owner, nodes) {\n    if (!nodes.length)\n      return;\n\n    var ownerDoc = owner.ownerDocument;\n\n    // All nodes have the same ownerDocument when we get here.\n    if (ownerDoc === nodes[0].ownerDocument)\n      return;\n\n    for (var i = 0; i < nodes.length; i++) {\n      scope.adoptNodeNoRemove(nodes[i], ownerDoc);\n    }\n  }\n\n  function unwrapNodesForInsertion(owner, nodes) {\n    adoptNodesIfNeeded(owner, nodes);\n    var length = nodes.length;\n\n    if (length === 1)\n      return unwrap(nodes[0]);\n\n    var df = unwrap(owner.ownerDocument.createDocumentFragment());\n    for (var i = 0; i < length; i++) {\n      df.appendChild(unwrap(nodes[i]));\n    }\n    return df;\n  }\n\n  function clearChildNodes(wrapper) {\n    if (wrapper.firstChild_ !== undefined) {\n      var child = wrapper.firstChild_;\n      while (child) {\n        var tmp = child;\n        child = child.nextSibling_;\n        tmp.parentNode_ = tmp.previousSibling_ = tmp.nextSibling_ = undefined;\n      }\n    }\n    wrapper.firstChild_ = wrapper.lastChild_ = undefined;\n  }\n\n  function removeAllChildNodes(wrapper) {\n    if (wrapper.invalidateShadowRenderer()) {\n      var childWrapper = wrapper.firstChild;\n      while (childWrapper) {\n        assert(childWrapper.parentNode === wrapper);\n        var nextSibling = childWrapper.nextSibling;\n        var childNode = unwrap(childWrapper);\n        var parentNode = childNode.parentNode;\n        if (parentNode)\n          originalRemoveChild.call(parentNode, childNode);\n        childWrapper.previousSibling_ = childWrapper.nextSibling_ =\n            childWrapper.parentNode_ = null;\n        childWrapper = nextSibling;\n      }\n      wrapper.firstChild_ = wrapper.lastChild_ = null;\n    } else {\n      var node = unwrap(wrapper);\n      var child = node.firstChild;\n      var nextSibling;\n      while (child) {\n        nextSibling = child.nextSibling;\n        originalRemoveChild.call(node, child);\n        child = nextSibling;\n      }\n    }\n  }\n\n  function invalidateParent(node) {\n    var p = node.parentNode;\n    return p && p.invalidateShadowRenderer();\n  }\n\n  function cleanupNodes(nodes) {\n    for (var i = 0, n; i < nodes.length; i++) {\n      n = nodes[i];\n      n.parentNode.removeChild(n);\n    }\n  }\n\n  var originalImportNode = document.importNode;\n  var originalCloneNode = window.Node.prototype.cloneNode;\n\n  function cloneNode(node, deep, opt_doc) {\n    var clone;\n    if (opt_doc)\n      clone = wrap(originalImportNode.call(opt_doc, node.impl, false));\n    else\n      clone = wrap(originalCloneNode.call(node.impl, false));\n\n    if (deep) {\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        clone.appendChild(cloneNode(child, true, opt_doc));\n      }\n\n      if (node instanceof wrappers.HTMLTemplateElement) {\n        var cloneContent = clone.content;\n        for (var child = node.content.firstChild;\n             child;\n             child = child.nextSibling) {\n         cloneContent.appendChild(cloneNode(child, true, opt_doc));\n        }\n      }\n    }\n    // TODO(arv): Some HTML elements also clone other data like value.\n    return clone;\n  }\n\n  function contains(self, child) {\n    if (!child || getTreeScope(self) !== getTreeScope(child))\n      return false;\n\n    for (var node = child; node; node = node.parentNode) {\n      if (node === self)\n        return true;\n    }\n    return false;\n  }\n\n  var OriginalNode = window.Node;\n\n  /**\n   * This represents a wrapper of a native DOM node.\n   * @param {!Node} original The original DOM node, aka, the visual DOM node.\n   * @constructor\n   * @extends {EventTarget}\n   */\n  function Node(original) {\n    assert(original instanceof OriginalNode);\n\n    EventTarget.call(this, original);\n\n    // These properties are used to override the visual references with the\n    // logical ones. If the value is undefined it means that the logical is the\n    // same as the visual.\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.parentNode_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.firstChild_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.lastChild_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.nextSibling_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.previousSibling_ = undefined;\n\n    this.treeScope_ = undefined;\n  }\n\n  var OriginalDocumentFragment = window.DocumentFragment;\n  var originalAppendChild = OriginalNode.prototype.appendChild;\n  var originalCompareDocumentPosition =\n      OriginalNode.prototype.compareDocumentPosition;\n  var originalInsertBefore = OriginalNode.prototype.insertBefore;\n  var originalRemoveChild = OriginalNode.prototype.removeChild;\n  var originalReplaceChild = OriginalNode.prototype.replaceChild;\n\n  var isIe = /Trident/.test(navigator.userAgent);\n\n  var removeChildOriginalHelper = isIe ?\n      function(parent, child) {\n        try {\n          originalRemoveChild.call(parent, child);\n        } catch (ex) {\n          if (!(parent instanceof OriginalDocumentFragment))\n            throw ex;\n        }\n      } :\n      function(parent, child) {\n        originalRemoveChild.call(parent, child);\n      };\n\n  Node.prototype = Object.create(EventTarget.prototype);\n  mixin(Node.prototype, {\n    appendChild: function(childWrapper) {\n      return this.insertBefore(childWrapper, null);\n    },\n\n    insertBefore: function(childWrapper, refWrapper) {\n      assertIsNodeWrapper(childWrapper);\n\n      var refNode;\n      if (refWrapper) {\n        if (isWrapper(refWrapper)) {\n          refNode = unwrap(refWrapper);\n        } else {\n          refNode = refWrapper;\n          refWrapper = wrap(refNode);\n        }\n      } else {\n        refWrapper = null;\n        refNode = null;\n      }\n\n      refWrapper && assert(refWrapper.parentNode === this);\n\n      var nodes;\n      var previousNode =\n          refWrapper ? refWrapper.previousSibling : this.lastChild;\n\n      var useNative = !this.invalidateShadowRenderer() &&\n                      !invalidateParent(childWrapper);\n\n      if (useNative)\n        nodes = collectNodesNative(childWrapper);\n      else\n        nodes = collectNodes(childWrapper, this, previousNode, refWrapper);\n\n      if (useNative) {\n        ensureSameOwnerDocument(this, childWrapper);\n        clearChildNodes(this);\n        originalInsertBefore.call(this.impl, unwrap(childWrapper), refNode);\n      } else {\n        if (!previousNode)\n          this.firstChild_ = nodes[0];\n        if (!refWrapper)\n          this.lastChild_ = nodes[nodes.length - 1];\n\n        var parentNode = refNode ? refNode.parentNode : this.impl;\n\n        // insertBefore refWrapper no matter what the parent is?\n        if (parentNode) {\n          originalInsertBefore.call(parentNode,\n              unwrapNodesForInsertion(this, nodes), refNode);\n        } else {\n          adoptNodesIfNeeded(this, nodes);\n        }\n      }\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: nodes,\n        nextSibling: refWrapper,\n        previousSibling: previousNode\n      });\n\n      nodesWereAdded(nodes, this);\n\n      return childWrapper;\n    },\n\n    removeChild: function(childWrapper) {\n      assertIsNodeWrapper(childWrapper);\n      if (childWrapper.parentNode !== this) {\n        // IE has invalid DOM trees at times.\n        var found = false;\n        var childNodes = this.childNodes;\n        for (var ieChild = this.firstChild; ieChild;\n             ieChild = ieChild.nextSibling) {\n          if (ieChild === childWrapper) {\n            found = true;\n            break;\n          }\n        }\n        if (!found) {\n          // TODO(arv): DOMException\n          throw new Error('NotFoundError');\n        }\n      }\n\n      var childNode = unwrap(childWrapper);\n      var childWrapperNextSibling = childWrapper.nextSibling;\n      var childWrapperPreviousSibling = childWrapper.previousSibling;\n\n      if (this.invalidateShadowRenderer()) {\n        // We need to remove the real node from the DOM before updating the\n        // pointers. This is so that that mutation event is dispatched before\n        // the pointers have changed.\n        var thisFirstChild = this.firstChild;\n        var thisLastChild = this.lastChild;\n\n        var parentNode = childNode.parentNode;\n        if (parentNode)\n          removeChildOriginalHelper(parentNode, childNode);\n\n        if (thisFirstChild === childWrapper)\n          this.firstChild_ = childWrapperNextSibling;\n        if (thisLastChild === childWrapper)\n          this.lastChild_ = childWrapperPreviousSibling;\n        if (childWrapperPreviousSibling)\n          childWrapperPreviousSibling.nextSibling_ = childWrapperNextSibling;\n        if (childWrapperNextSibling) {\n          childWrapperNextSibling.previousSibling_ =\n              childWrapperPreviousSibling;\n        }\n\n        childWrapper.previousSibling_ = childWrapper.nextSibling_ =\n            childWrapper.parentNode_ = undefined;\n      } else {\n        clearChildNodes(this);\n        removeChildOriginalHelper(this.impl, childNode);\n      }\n\n      if (!surpressMutations) {\n        enqueueMutation(this, 'childList', {\n          removedNodes: createOneElementNodeList(childWrapper),\n          nextSibling: childWrapperNextSibling,\n          previousSibling: childWrapperPreviousSibling\n        });\n      }\n\n      registerTransientObservers(this, childWrapper);\n\n      return childWrapper;\n    },\n\n    replaceChild: function(newChildWrapper, oldChildWrapper) {\n      assertIsNodeWrapper(newChildWrapper);\n\n      var oldChildNode;\n      if (isWrapper(oldChildWrapper)) {\n        oldChildNode = unwrap(oldChildWrapper);\n      } else {\n        oldChildNode = oldChildWrapper;\n        oldChildWrapper = wrap(oldChildNode);\n      }\n\n      if (oldChildWrapper.parentNode !== this) {\n        // TODO(arv): DOMException\n        throw new Error('NotFoundError');\n      }\n\n      var nextNode = oldChildWrapper.nextSibling;\n      var previousNode = oldChildWrapper.previousSibling;\n      var nodes;\n\n      var useNative = !this.invalidateShadowRenderer() &&\n                      !invalidateParent(newChildWrapper);\n\n      if (useNative) {\n        nodes = collectNodesNative(newChildWrapper);\n      } else {\n        if (nextNode === newChildWrapper)\n          nextNode = newChildWrapper.nextSibling;\n        nodes = collectNodes(newChildWrapper, this, previousNode, nextNode);\n      }\n\n      if (!useNative) {\n        if (this.firstChild === oldChildWrapper)\n          this.firstChild_ = nodes[0];\n        if (this.lastChild === oldChildWrapper)\n          this.lastChild_ = nodes[nodes.length - 1];\n\n        oldChildWrapper.previousSibling_ = oldChildWrapper.nextSibling_ =\n            oldChildWrapper.parentNode_ = undefined;\n\n        // replaceChild no matter what the parent is?\n        if (oldChildNode.parentNode) {\n          originalReplaceChild.call(\n              oldChildNode.parentNode,\n              unwrapNodesForInsertion(this, nodes),\n              oldChildNode);\n        }\n      } else {\n        ensureSameOwnerDocument(this, newChildWrapper);\n        clearChildNodes(this);\n        originalReplaceChild.call(this.impl, unwrap(newChildWrapper),\n                                  oldChildNode);\n      }\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: nodes,\n        removedNodes: createOneElementNodeList(oldChildWrapper),\n        nextSibling: nextNode,\n        previousSibling: previousNode\n      });\n\n      nodeWasRemoved(oldChildWrapper);\n      nodesWereAdded(nodes, this);\n\n      return oldChildWrapper;\n    },\n\n    /**\n     * Called after a node was inserted. Subclasses override this to invalidate\n     * the renderer as needed.\n     * @private\n     */\n    nodeIsInserted_: function() {\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        child.nodeIsInserted_();\n      }\n    },\n\n    hasChildNodes: function() {\n      return this.firstChild !== null;\n    },\n\n    /** @type {Node} */\n    get parentNode() {\n      // If the parentNode has not been overridden, use the original parentNode.\n      return this.parentNode_ !== undefined ?\n          this.parentNode_ : wrap(this.impl.parentNode);\n    },\n\n    /** @type {Node} */\n    get firstChild() {\n      return this.firstChild_ !== undefined ?\n          this.firstChild_ : wrap(this.impl.firstChild);\n    },\n\n    /** @type {Node} */\n    get lastChild() {\n      return this.lastChild_ !== undefined ?\n          this.lastChild_ : wrap(this.impl.lastChild);\n    },\n\n    /** @type {Node} */\n    get nextSibling() {\n      return this.nextSibling_ !== undefined ?\n          this.nextSibling_ : wrap(this.impl.nextSibling);\n    },\n\n    /** @type {Node} */\n    get previousSibling() {\n      return this.previousSibling_ !== undefined ?\n          this.previousSibling_ : wrap(this.impl.previousSibling);\n    },\n\n    get parentElement() {\n      var p = this.parentNode;\n      while (p && p.nodeType !== Node.ELEMENT_NODE) {\n        p = p.parentNode;\n      }\n      return p;\n    },\n\n    get textContent() {\n      // TODO(arv): This should fallback to this.impl.textContent if there\n      // are no shadow trees below or above the context node.\n      var s = '';\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        if (child.nodeType != Node.COMMENT_NODE) {\n          s += child.textContent;\n        }\n      }\n      return s;\n    },\n    set textContent(textContent) {\n      var removedNodes = snapshotNodeList(this.childNodes);\n\n      if (this.invalidateShadowRenderer()) {\n        removeAllChildNodes(this);\n        if (textContent !== '') {\n          var textNode = this.impl.ownerDocument.createTextNode(textContent);\n          this.appendChild(textNode);\n        }\n      } else {\n        clearChildNodes(this);\n        this.impl.textContent = textContent;\n      }\n\n      var addedNodes = snapshotNodeList(this.childNodes);\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: addedNodes,\n        removedNodes: removedNodes\n      });\n\n      nodesWereRemoved(removedNodes);\n      nodesWereAdded(addedNodes, this);\n    },\n\n    get childNodes() {\n      var wrapperList = new NodeList();\n      var i = 0;\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        wrapperList[i++] = child;\n      }\n      wrapperList.length = i;\n      return wrapperList;\n    },\n\n    cloneNode: function(deep) {\n      return cloneNode(this, deep);\n    },\n\n    contains: function(child) {\n      return contains(this, wrapIfNeeded(child));\n    },\n\n    compareDocumentPosition: function(otherNode) {\n      // This only wraps, it therefore only operates on the composed DOM and not\n      // the logical DOM.\n      return originalCompareDocumentPosition.call(this.impl,\n                                                  unwrapIfNeeded(otherNode));\n    },\n\n    normalize: function() {\n      var nodes = snapshotNodeList(this.childNodes);\n      var remNodes = [];\n      var s = '';\n      var modNode;\n\n      for (var i = 0, n; i < nodes.length; i++) {\n        n = nodes[i];\n        if (n.nodeType === Node.TEXT_NODE) {\n          if (!modNode && !n.data.length)\n            this.removeNode(n);\n          else if (!modNode)\n            modNode = n;\n          else {\n            s += n.data;\n            remNodes.push(n);\n          }\n        } else {\n          if (modNode && remNodes.length) {\n            modNode.data += s;\n            cleanUpNodes(remNodes);\n          }\n          remNodes = [];\n          s = '';\n          modNode = null;\n          if (n.childNodes.length)\n            n.normalize();\n        }\n      }\n\n      // handle case where >1 text nodes are the last children\n      if (modNode && remNodes.length) {\n        modNode.data += s;\n        cleanupNodes(remNodes);\n      }\n    }\n  });\n\n  defineWrapGetter(Node, 'ownerDocument');\n\n  // We use a DocumentFragment as a base and then delete the properties of\n  // DocumentFragment.prototype from the wrapper Node. Since delete makes\n  // objects slow in some JS engines we recreate the prototype object.\n  registerWrapper(OriginalNode, Node, document.createDocumentFragment());\n  delete Node.prototype.querySelector;\n  delete Node.prototype.querySelectorAll;\n  Node.prototype = mixin(Object.create(EventTarget.prototype), Node.prototype);\n\n  scope.cloneNode = cloneNode;\n  scope.nodeWasAdded = nodeWasAdded;\n  scope.nodeWasRemoved = nodeWasRemoved;\n  scope.nodesWereAdded = nodesWereAdded;\n  scope.nodesWereRemoved = nodesWereRemoved;\n  scope.snapshotNodeList = snapshotNodeList;\n  scope.wrappers.Node = Node;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLCollection = scope.wrappers.HTMLCollection;\n  var NodeList = scope.wrappers.NodeList;\n\n  function findOne(node, selector) {\n    var m, el = node.firstElementChild;\n    while (el) {\n      if (el.matches(selector))\n        return el;\n      m = findOne(el, selector);\n      if (m)\n        return m;\n      el = el.nextElementSibling;\n    }\n    return null;\n  }\n\n  function matchesSelector(el, selector) {\n    return el.matches(selector);\n  }\n\n  var XHTML_NS = 'http://www.w3.org/1999/xhtml';\n\n  function matchesTagName(el, localName, localNameLowerCase) {\n    var ln = el.localName;\n    return ln === localName ||\n        ln === localNameLowerCase && el.namespaceURI === XHTML_NS;\n  }\n\n  function matchesEveryThing() {\n    return true;\n  }\n\n  function matchesLocalName(el, localName) {\n    return el.localName === localName;\n  }\n\n  function matchesNameSpace(el, ns) {\n    return el.namespaceURI === ns;\n  }\n\n  function matchesLocalNameNS(el, ns, localName) {\n    return el.namespaceURI === ns && el.localName === localName;\n  }\n\n  function findElements(node, result, p, arg0, arg1) {\n    var el = node.firstElementChild;\n    while (el) {\n      if (p(el, arg0, arg1))\n        result[result.length++] = el;\n      findElements(el, result, p, arg0, arg1);\n      el = el.nextElementSibling;\n    }\n    return result;\n  }\n\n  // find and findAll will only match Simple Selectors,\n  // Structural Pseudo Classes are not guarenteed to be correct\n  // http://www.w3.org/TR/css3-selectors/#simple-selectors\n\n  var SelectorsInterface = {\n    querySelector: function(selector) {\n      return findOne(this, selector);\n    },\n    querySelectorAll: function(selector) {\n      return findElements(this, new NodeList(), matchesSelector, selector);\n    }\n  };\n\n  var GetElementsByInterface = {\n    getElementsByTagName: function(localName) {\n      var result = new HTMLCollection();\n      if (localName === '*')\n        return findElements(this, result, matchesEveryThing);\n\n      return findElements(this, result,\n          matchesTagName,\n          localName,\n          localName.toLowerCase());\n    },\n\n    getElementsByClassName: function(className) {\n      // TODO(arv): Check className?\n      return this.querySelectorAll('.' + className);\n    },\n\n    getElementsByTagNameNS: function(ns, localName) {\n      var result = new HTMLCollection();\n\n      if (ns === '') {\n        ns = null;\n      } else if (ns === '*') {\n        if (localName === '*')\n          return findElements(this, result, matchesEveryThing);\n        return findElements(this, result, matchesLocalName, localName);\n      }\n\n      if (localName === '*')\n        return findElements(this, result, matchesNameSpace, ns);\n\n      return findElements(this, result, matchesLocalNameNS, ns, localName);\n    }\n  };\n\n  scope.GetElementsByInterface = GetElementsByInterface;\n  scope.SelectorsInterface = SelectorsInterface;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var NodeList = scope.wrappers.NodeList;\n\n  function forwardElement(node) {\n    while (node && node.nodeType !== Node.ELEMENT_NODE) {\n      node = node.nextSibling;\n    }\n    return node;\n  }\n\n  function backwardsElement(node) {\n    while (node && node.nodeType !== Node.ELEMENT_NODE) {\n      node = node.previousSibling;\n    }\n    return node;\n  }\n\n  var ParentNodeInterface = {\n    get firstElementChild() {\n      return forwardElement(this.firstChild);\n    },\n\n    get lastElementChild() {\n      return backwardsElement(this.lastChild);\n    },\n\n    get childElementCount() {\n      var count = 0;\n      for (var child = this.firstElementChild;\n           child;\n           child = child.nextElementSibling) {\n        count++;\n      }\n      return count;\n    },\n\n    get children() {\n      var wrapperList = new NodeList();\n      var i = 0;\n      for (var child = this.firstElementChild;\n           child;\n           child = child.nextElementSibling) {\n        wrapperList[i++] = child;\n      }\n      wrapperList.length = i;\n      return wrapperList;\n    },\n\n    remove: function() {\n      var p = this.parentNode;\n      if (p)\n        p.removeChild(this);\n    }\n  };\n\n  var ChildNodeInterface = {\n    get nextElementSibling() {\n      return forwardElement(this.nextSibling);\n    },\n\n    get previousElementSibling() {\n      return backwardsElement(this.previousSibling);\n    }\n  };\n\n  scope.ChildNodeInterface = ChildNodeInterface;\n  scope.ParentNodeInterface = ParentNodeInterface;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var ChildNodeInterface = scope.ChildNodeInterface;\n  var Node = scope.wrappers.Node;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalCharacterData = window.CharacterData;\n\n  function CharacterData(node) {\n    Node.call(this, node);\n  }\n  CharacterData.prototype = Object.create(Node.prototype);\n  mixin(CharacterData.prototype, {\n    get textContent() {\n      return this.data;\n    },\n    set textContent(value) {\n      this.data = value;\n    },\n    get data() {\n      return this.impl.data;\n    },\n    set data(value) {\n      var oldValue = this.impl.data;\n      enqueueMutation(this, 'characterData', {\n        oldValue: oldValue\n      });\n      this.impl.data = value;\n    }\n  });\n\n  mixin(CharacterData.prototype, ChildNodeInterface);\n\n  registerWrapper(OriginalCharacterData, CharacterData,\n                  document.createTextNode(''));\n\n  scope.wrappers.CharacterData = CharacterData;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var CharacterData = scope.wrappers.CharacterData;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  function toUInt32(x) {\n    return x >>> 0;\n  }\n\n  var OriginalText = window.Text;\n\n  function Text(node) {\n    CharacterData.call(this, node);\n  }\n  Text.prototype = Object.create(CharacterData.prototype);\n  mixin(Text.prototype, {\n    splitText: function(offset) {\n      offset = toUInt32(offset);\n      var s = this.data;\n      if (offset > s.length)\n        throw new Error('IndexSizeError');\n      var head = s.slice(0, offset);\n      var tail = s.slice(offset);\n      this.data = head;\n      var newTextNode = this.ownerDocument.createTextNode(tail);\n      if (this.parentNode)\n        this.parentNode.insertBefore(newTextNode, this.nextSibling);\n      return newTextNode;\n    }\n  });\n\n  registerWrapper(OriginalText, Text, document.createTextNode(''));\n\n  scope.wrappers.Text = Text;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var ChildNodeInterface = scope.ChildNodeInterface;\n  var GetElementsByInterface = scope.GetElementsByInterface;\n  var Node = scope.wrappers.Node;\n  var ParentNodeInterface = scope.ParentNodeInterface;\n  var SelectorsInterface = scope.SelectorsInterface;\n  var addWrapNodeListMethod = scope.addWrapNodeListMethod;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var oneOf = scope.oneOf;\n  var registerWrapper = scope.registerWrapper;\n  var wrappers = scope.wrappers;\n\n  var OriginalElement = window.Element;\n\n  var matchesNames = [\n    'matches',  // needs to come first.\n    'mozMatchesSelector',\n    'msMatchesSelector',\n    'webkitMatchesSelector',\n  ].filter(function(name) {\n    return OriginalElement.prototype[name];\n  });\n\n  var matchesName = matchesNames[0];\n\n  var originalMatches = OriginalElement.prototype[matchesName];\n\n  function invalidateRendererBasedOnAttribute(element, name) {\n    // Only invalidate if parent node is a shadow host.\n    var p = element.parentNode;\n    if (!p || !p.shadowRoot)\n      return;\n\n    var renderer = scope.getRendererForHost(p);\n    if (renderer.dependsOnAttribute(name))\n      renderer.invalidate();\n  }\n\n  function enqueAttributeChange(element, name, oldValue) {\n    // This is not fully spec compliant. We should use localName (which might\n    // have a different case than name) and the namespace (which requires us\n    // to get the Attr object).\n    enqueueMutation(element, 'attributes', {\n      name: name,\n      namespace: null,\n      oldValue: oldValue\n    });\n  }\n\n  function Element(node) {\n    Node.call(this, node);\n  }\n  Element.prototype = Object.create(Node.prototype);\n  mixin(Element.prototype, {\n    createShadowRoot: function() {\n      var newShadowRoot = new wrappers.ShadowRoot(this);\n      this.impl.polymerShadowRoot_ = newShadowRoot;\n\n      var renderer = scope.getRendererForHost(this);\n      renderer.invalidate();\n\n      return newShadowRoot;\n    },\n\n    get shadowRoot() {\n      return this.impl.polymerShadowRoot_ || null;\n    },\n\n    setAttribute: function(name, value) {\n      var oldValue = this.impl.getAttribute(name);\n      this.impl.setAttribute(name, value);\n      enqueAttributeChange(this, name, oldValue);\n      invalidateRendererBasedOnAttribute(this, name);\n    },\n\n    removeAttribute: function(name) {\n      var oldValue = this.impl.getAttribute(name);\n      this.impl.removeAttribute(name);\n      enqueAttributeChange(this, name, oldValue);\n      invalidateRendererBasedOnAttribute(this, name);\n    },\n\n    matches: function(selector) {\n      return originalMatches.call(this.impl, selector);\n    }\n  });\n\n  matchesNames.forEach(function(name) {\n    if (name !== 'matches') {\n      Element.prototype[name] = function(selector) {\n        return this.matches(selector);\n      };\n    }\n  });\n\n  if (OriginalElement.prototype.webkitCreateShadowRoot) {\n    Element.prototype.webkitCreateShadowRoot =\n        Element.prototype.createShadowRoot;\n  }\n\n  /**\n   * Useful for generating the accessor pair for a property that reflects an\n   * attribute.\n   */\n  function setterDirtiesAttribute(prototype, propertyName, opt_attrName) {\n    var attrName = opt_attrName || propertyName;\n    Object.defineProperty(prototype, propertyName, {\n      get: function() {\n        return this.impl[propertyName];\n      },\n      set: function(v) {\n        this.impl[propertyName] = v;\n        invalidateRendererBasedOnAttribute(this, attrName);\n      },\n      configurable: true,\n      enumerable: true\n    });\n  }\n\n  setterDirtiesAttribute(Element.prototype, 'id');\n  setterDirtiesAttribute(Element.prototype, 'className', 'class');\n\n  mixin(Element.prototype, ChildNodeInterface);\n  mixin(Element.prototype, GetElementsByInterface);\n  mixin(Element.prototype, ParentNodeInterface);\n  mixin(Element.prototype, SelectorsInterface);\n\n  registerWrapper(OriginalElement, Element,\n                  document.createElementNS(null, 'x'));\n\n  // TODO(arv): Export setterDirtiesAttribute and apply it to more bindings\n  // that reflect attributes.\n  scope.matchesNames = matchesNames;\n  scope.wrappers.Element = Element;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var Element = scope.wrappers.Element;\n  var defineGetter = scope.defineGetter;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var nodesWereAdded = scope.nodesWereAdded;\n  var nodesWereRemoved = scope.nodesWereRemoved;\n  var registerWrapper = scope.registerWrapper;\n  var snapshotNodeList = scope.snapshotNodeList;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrappers = scope.wrappers;\n\n  /////////////////////////////////////////////////////////////////////////////\n  // innerHTML and outerHTML\n\n  // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#escapingString\n  var escapeAttrRegExp = /[&\\u00A0\"]/g;\n  var escapeDataRegExp = /[&\\u00A0<>]/g;\n\n  function escapeReplace(c) {\n    switch (c) {\n      case '&':\n        return '&amp;';\n      case '<':\n        return '&lt;';\n      case '>':\n        return '&gt;';\n      case '\"':\n        return '&quot;'\n      case '\\u00A0':\n        return '&nbsp;';\n    }\n  }\n\n  function escapeAttr(s) {\n    return s.replace(escapeAttrRegExp, escapeReplace);\n  }\n\n  function escapeData(s) {\n    return s.replace(escapeDataRegExp, escapeReplace);\n  }\n\n  function makeSet(arr) {\n    var set = {};\n    for (var i = 0; i < arr.length; i++) {\n      set[arr[i]] = true;\n    }\n    return set;\n  }\n\n  // http://www.whatwg.org/specs/web-apps/current-work/#void-elements\n  var voidElements = makeSet([\n    'area',\n    'base',\n    'br',\n    'col',\n    'command',\n    'embed',\n    'hr',\n    'img',\n    'input',\n    'keygen',\n    'link',\n    'meta',\n    'param',\n    'source',\n    'track',\n    'wbr'\n  ]);\n\n  var plaintextParents = makeSet([\n    'style',\n    'script',\n    'xmp',\n    'iframe',\n    'noembed',\n    'noframes',\n    'plaintext',\n    'noscript'\n  ]);\n\n  function getOuterHTML(node, parentNode) {\n    switch (node.nodeType) {\n      case Node.ELEMENT_NODE:\n        var tagName = node.tagName.toLowerCase();\n        var s = '<' + tagName;\n        var attrs = node.attributes;\n        for (var i = 0, attr; attr = attrs[i]; i++) {\n          s += ' ' + attr.name + '=\"' + escapeAttr(attr.value) + '\"';\n        }\n        s += '>';\n        if (voidElements[tagName])\n          return s;\n\n        return s + getInnerHTML(node) + '</' + tagName + '>';\n\n      case Node.TEXT_NODE:\n        var data = node.data;\n        if (parentNode && plaintextParents[parentNode.localName])\n          return data;\n        return escapeData(data);\n\n      case Node.COMMENT_NODE:\n        return '<!--' + node.data + '-->';\n\n      default:\n        console.error(node);\n        throw new Error('not implemented');\n    }\n  }\n\n  function getInnerHTML(node) {\n    if (node instanceof wrappers.HTMLTemplateElement)\n      node = node.content;\n\n    var s = '';\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      s += getOuterHTML(child, node);\n    }\n    return s;\n  }\n\n  function setInnerHTML(node, value, opt_tagName) {\n    var tagName = opt_tagName || 'div';\n    node.textContent = '';\n    var tempElement = unwrap(node.ownerDocument.createElement(tagName));\n    tempElement.innerHTML = value;\n    var firstChild;\n    while (firstChild = tempElement.firstChild) {\n      node.appendChild(wrap(firstChild));\n    }\n  }\n\n  // IE11 does not have MSIE in the user agent string.\n  var oldIe = /MSIE/.test(navigator.userAgent);\n\n  var OriginalHTMLElement = window.HTMLElement;\n  var OriginalHTMLTemplateElement = window.HTMLTemplateElement;\n\n  function HTMLElement(node) {\n    Element.call(this, node);\n  }\n  HTMLElement.prototype = Object.create(Element.prototype);\n  mixin(HTMLElement.prototype, {\n    get innerHTML() {\n      return getInnerHTML(this);\n    },\n    set innerHTML(value) {\n      // IE9 does not handle set innerHTML correctly on plaintextParents. It\n      // creates element children. For example\n      //\n      //   scriptElement.innerHTML = '<a>test</a>'\n      //\n      // Creates a single HTMLAnchorElement child.\n      if (oldIe && plaintextParents[this.localName]) {\n        this.textContent = value;\n        return;\n      }\n\n      var removedNodes = snapshotNodeList(this.childNodes);\n\n      if (this.invalidateShadowRenderer()) {\n        if (this instanceof wrappers.HTMLTemplateElement)\n          setInnerHTML(this.content, value);\n        else\n          setInnerHTML(this, value, this.tagName);\n\n      // If we have a non native template element we need to handle this\n      // manually since setting impl.innerHTML would add the html as direct\n      // children and not be moved over to the content fragment.\n      } else if (!OriginalHTMLTemplateElement &&\n                 this instanceof wrappers.HTMLTemplateElement) {\n        setInnerHTML(this.content, value);\n      } else {\n        this.impl.innerHTML = value;\n      }\n\n      var addedNodes = snapshotNodeList(this.childNodes);\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: addedNodes,\n        removedNodes: removedNodes\n      });\n\n      nodesWereRemoved(removedNodes);\n      nodesWereAdded(addedNodes, this);\n    },\n\n    get outerHTML() {\n      return getOuterHTML(this, this.parentNode);\n    },\n    set outerHTML(value) {\n      var p = this.parentNode;\n      if (p) {\n        p.invalidateShadowRenderer();\n        var df = frag(p, value);\n        p.replaceChild(df, this);\n      }\n    },\n\n    insertAdjacentHTML: function(position, text) {\n      var contextElement, refNode;\n      switch (String(position).toLowerCase()) {\n        case 'beforebegin':\n          contextElement = this.parentNode;\n          refNode = this;\n          break;\n        case 'afterend':\n          contextElement = this.parentNode;\n          refNode = this.nextSibling;\n          break;\n        case 'afterbegin':\n          contextElement = this;\n          refNode = this.firstChild;\n          break;\n        case 'beforeend':\n          contextElement = this;\n          refNode = null;\n          break;\n        default:\n          return;\n      }\n\n      var df = frag(contextElement, text);\n      contextElement.insertBefore(df, refNode);\n    }\n  });\n\n  function frag(contextElement, html) {\n    // TODO(arv): This does not work with SVG and other non HTML elements.\n    var p = unwrap(contextElement.cloneNode(false));\n    p.innerHTML = html;\n    var df = unwrap(document.createDocumentFragment());\n    var c;\n    while (c = p.firstChild) {\n      df.appendChild(c);\n    }\n    return wrap(df);\n  }\n\n  function getter(name) {\n    return function() {\n      scope.renderAllPending();\n      return this.impl[name];\n    };\n  }\n\n  function getterRequiresRendering(name) {\n    defineGetter(HTMLElement, name, getter(name));\n  }\n\n  [\n    'clientHeight',\n    'clientLeft',\n    'clientTop',\n    'clientWidth',\n    'offsetHeight',\n    'offsetLeft',\n    'offsetTop',\n    'offsetWidth',\n    'scrollHeight',\n    'scrollWidth',\n  ].forEach(getterRequiresRendering);\n\n  function getterAndSetterRequiresRendering(name) {\n    Object.defineProperty(HTMLElement.prototype, name, {\n      get: getter(name),\n      set: function(v) {\n        scope.renderAllPending();\n        this.impl[name] = v;\n      },\n      configurable: true,\n      enumerable: true\n    });\n  }\n\n  [\n    'scrollLeft',\n    'scrollTop',\n  ].forEach(getterAndSetterRequiresRendering);\n\n  function methodRequiresRendering(name) {\n    Object.defineProperty(HTMLElement.prototype, name, {\n      value: function() {\n        scope.renderAllPending();\n        return this.impl[name].apply(this.impl, arguments);\n      },\n      configurable: true,\n      enumerable: true\n    });\n  }\n\n  [\n    'getBoundingClientRect',\n    'getClientRects',\n    'scrollIntoView'\n  ].forEach(methodRequiresRendering);\n\n  // HTMLElement is abstract so we use a subclass that has no members.\n  registerWrapper(OriginalHTMLElement, HTMLElement,\n                  document.createElement('b'));\n\n  scope.wrappers.HTMLElement = HTMLElement;\n\n  // TODO: Find a better way to share these two with WrapperShadowRoot.\n  scope.getInnerHTML = getInnerHTML;\n  scope.setInnerHTML = setInnerHTML\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLCanvasElement = window.HTMLCanvasElement;\n\n  function HTMLCanvasElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLCanvasElement.prototype = Object.create(HTMLElement.prototype);\n\n  mixin(HTMLCanvasElement.prototype, {\n    getContext: function() {\n      var context = this.impl.getContext.apply(this.impl, arguments);\n      return context && wrap(context);\n    }\n  });\n\n  registerWrapper(OriginalHTMLCanvasElement, HTMLCanvasElement,\n                  document.createElement('canvas'));\n\n  scope.wrappers.HTMLCanvasElement = HTMLCanvasElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLContentElement = window.HTMLContentElement;\n\n  function HTMLContentElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLContentElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLContentElement.prototype, {\n    get select() {\n      return this.getAttribute('select');\n    },\n    set select(value) {\n      this.setAttribute('select', value);\n    },\n\n    setAttribute: function(n, v) {\n      HTMLElement.prototype.setAttribute.call(this, n, v);\n      if (String(n).toLowerCase() === 'select')\n        this.invalidateShadowRenderer(true);\n    }\n\n    // getDistributedNodes is added in ShadowRenderer\n\n    // TODO: attribute boolean resetStyleInheritance;\n  });\n\n  if (OriginalHTMLContentElement)\n    registerWrapper(OriginalHTMLContentElement, HTMLContentElement);\n\n  scope.wrappers.HTMLContentElement = HTMLContentElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var rewrap = scope.rewrap;\n\n  var OriginalHTMLImageElement = window.HTMLImageElement;\n\n  function HTMLImageElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLImageElement.prototype = Object.create(HTMLElement.prototype);\n\n  registerWrapper(OriginalHTMLImageElement, HTMLImageElement,\n                  document.createElement('img'));\n\n  function Image(width, height) {\n    if (!(this instanceof Image)) {\n      throw new TypeError(\n          'DOM object constructor cannot be called as a function.');\n    }\n\n    var node = unwrap(document.createElement('img'));\n    HTMLElement.call(this, node);\n    rewrap(node, this);\n\n    if (width !== undefined)\n      node.width = width;\n    if (height !== undefined)\n      node.height = height;\n  }\n\n  Image.prototype = HTMLImageElement.prototype;\n\n  scope.wrappers.HTMLImageElement = HTMLImageElement;\n  scope.wrappers.Image = Image;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLShadowElement = window.HTMLShadowElement;\n\n  function HTMLShadowElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLShadowElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLShadowElement.prototype, {\n    // TODO: attribute boolean resetStyleInheritance;\n  });\n\n  if (OriginalHTMLShadowElement)\n    registerWrapper(OriginalHTMLShadowElement, HTMLShadowElement);\n\n  scope.wrappers.HTMLShadowElement = HTMLShadowElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var contentTable = new WeakMap();\n  var templateContentsOwnerTable = new WeakMap();\n\n  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/templates/index.html#dfn-template-contents-owner\n  function getTemplateContentsOwner(doc) {\n    if (!doc.defaultView)\n      return doc;\n    var d = templateContentsOwnerTable.get(doc);\n    if (!d) {\n      // TODO(arv): This should either be a Document or HTMLDocument depending\n      // on doc.\n      d = doc.implementation.createHTMLDocument('');\n      while (d.lastChild) {\n        d.removeChild(d.lastChild);\n      }\n      templateContentsOwnerTable.set(doc, d);\n    }\n    return d;\n  }\n\n  function extractContent(templateElement) {\n    // templateElement is not a wrapper here.\n    var doc = getTemplateContentsOwner(templateElement.ownerDocument);\n    var df = unwrap(doc.createDocumentFragment());\n    var child;\n    while (child = templateElement.firstChild) {\n      df.appendChild(child);\n    }\n    return df;\n  }\n\n  var OriginalHTMLTemplateElement = window.HTMLTemplateElement;\n\n  function HTMLTemplateElement(node) {\n    HTMLElement.call(this, node);\n    if (!OriginalHTMLTemplateElement) {\n      var content = extractContent(node);\n      contentTable.set(this, wrap(content));\n    }\n  }\n  HTMLTemplateElement.prototype = Object.create(HTMLElement.prototype);\n\n  mixin(HTMLTemplateElement.prototype, {\n    get content() {\n      if (OriginalHTMLTemplateElement)\n        return wrap(this.impl.content);\n      return contentTable.get(this);\n    },\n\n    // TODO(arv): cloneNode needs to clone content.\n\n  });\n\n  if (OriginalHTMLTemplateElement)\n    registerWrapper(OriginalHTMLTemplateElement, HTMLTemplateElement);\n\n  scope.wrappers.HTMLTemplateElement = HTMLTemplateElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLMediaElement = window.HTMLMediaElement;\n\n  function HTMLMediaElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLMediaElement.prototype = Object.create(HTMLElement.prototype);\n\n  registerWrapper(OriginalHTMLMediaElement, HTMLMediaElement,\n                  document.createElement('audio'));\n\n  scope.wrappers.HTMLMediaElement = HTMLMediaElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLMediaElement = scope.wrappers.HTMLMediaElement;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var rewrap = scope.rewrap;\n\n  var OriginalHTMLAudioElement = window.HTMLAudioElement;\n\n  function HTMLAudioElement(node) {\n    HTMLMediaElement.call(this, node);\n  }\n  HTMLAudioElement.prototype = Object.create(HTMLMediaElement.prototype);\n\n  registerWrapper(OriginalHTMLAudioElement, HTMLAudioElement,\n                  document.createElement('audio'));\n\n  function Audio(src) {\n    if (!(this instanceof Audio)) {\n      throw new TypeError(\n          'DOM object constructor cannot be called as a function.');\n    }\n\n    var node = unwrap(document.createElement('audio'));\n    HTMLMediaElement.call(this, node);\n    rewrap(node, this);\n\n    node.setAttribute('preload', 'auto');\n    if (src !== undefined)\n      node.setAttribute('src', src);\n  }\n\n  Audio.prototype = HTMLAudioElement.prototype;\n\n  scope.wrappers.HTMLAudioElement = HTMLAudioElement;\n  scope.wrappers.Audio = Audio;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var rewrap = scope.rewrap;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLOptionElement = window.HTMLOptionElement;\n\n  function trimText(s) {\n    return s.replace(/\\s+/g, ' ').trim();\n  }\n\n  function HTMLOptionElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLOptionElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLOptionElement.prototype, {\n    get text() {\n      return trimText(this.textContent);\n    },\n    set text(value) {\n      this.textContent = trimText(String(value));\n    },\n    get form() {\n      return wrap(unwrap(this).form);\n    }\n  });\n\n  registerWrapper(OriginalHTMLOptionElement, HTMLOptionElement,\n                  document.createElement('option'));\n\n  function Option(text, value, defaultSelected, selected) {\n    if (!(this instanceof Option)) {\n      throw new TypeError(\n          'DOM object constructor cannot be called as a function.');\n    }\n\n    var node = unwrap(document.createElement('option'));\n    HTMLElement.call(this, node);\n    rewrap(node, this);\n\n    if (text !== undefined)\n      node.text = text;\n    if (value !== undefined)\n      node.setAttribute('value', value);\n    if (defaultSelected === true)\n      node.setAttribute('selected', '');\n    node.selected = selected === true;\n  }\n\n  Option.prototype = HTMLOptionElement.prototype;\n\n  scope.wrappers.HTMLOptionElement = HTMLOptionElement;\n  scope.wrappers.Option = Option;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLSelectElement = window.HTMLSelectElement;\n\n  function HTMLSelectElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLSelectElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLSelectElement.prototype, {\n    add: function(element, before) {\n      if (typeof before === 'object')  // also includes null\n        before = unwrap(before);\n      unwrap(this).add(unwrap(element), before);\n    },\n\n    remove: function(indexOrNode) {\n      // Spec only allows index but implementations allow index or node.\n      // remove() is also allowed which is same as remove(undefined)\n      if (indexOrNode === undefined) {\n        HTMLElement.prototype.remove.call(this);\n        return;\n      }\n\n      if (typeof indexOrNode === 'object')\n        indexOrNode = unwrap(indexOrNode);\n\n      unwrap(this).remove(indexOrNode);\n    },\n\n    get form() {\n      return wrap(unwrap(this).form);\n    }\n  });\n\n  registerWrapper(OriginalHTMLSelectElement, HTMLSelectElement,\n                  document.createElement('select'));\n\n  scope.wrappers.HTMLSelectElement = HTMLSelectElement;\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrapHTMLCollection = scope.wrapHTMLCollection;\n\n  var OriginalHTMLTableElement = window.HTMLTableElement;\n\n  function HTMLTableElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLTableElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLTableElement.prototype, {\n    get caption() {\n      return wrap(unwrap(this).caption);\n    },\n    createCaption: function() {\n      return wrap(unwrap(this).createCaption());\n    },\n\n    get tHead() {\n      return wrap(unwrap(this).tHead);\n    },\n    createTHead: function() {\n      return wrap(unwrap(this).createTHead());\n    },\n\n    createTFoot: function() {\n      return wrap(unwrap(this).createTFoot());\n    },\n    get tFoot() {\n      return wrap(unwrap(this).tFoot);\n    },\n\n    get tBodies() {\n      return wrapHTMLCollection(unwrap(this).tBodies);\n    },\n    createTBody: function() {\n      return wrap(unwrap(this).createTBody());\n    },\n\n    get rows() {\n      return wrapHTMLCollection(unwrap(this).rows);\n    },\n    insertRow: function(index) {\n      return wrap(unwrap(this).insertRow(index));\n    }\n  });\n\n  registerWrapper(OriginalHTMLTableElement, HTMLTableElement,\n                  document.createElement('table'));\n\n  scope.wrappers.HTMLTableElement = HTMLTableElement;\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrapHTMLCollection = scope.wrapHTMLCollection;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLTableSectionElement = window.HTMLTableSectionElement;\n\n  function HTMLTableSectionElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLTableSectionElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLTableSectionElement.prototype, {\n    get rows() {\n      return wrapHTMLCollection(unwrap(this).rows);\n    },\n    insertRow: function(index) {\n      return wrap(unwrap(this).insertRow(index));\n    }\n  });\n\n  registerWrapper(OriginalHTMLTableSectionElement, HTMLTableSectionElement,\n                  document.createElement('thead'));\n\n  scope.wrappers.HTMLTableSectionElement = HTMLTableSectionElement;\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrapHTMLCollection = scope.wrapHTMLCollection;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLTableRowElement = window.HTMLTableRowElement;\n\n  function HTMLTableRowElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLTableRowElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLTableRowElement.prototype, {\n    get cells() {\n      return wrapHTMLCollection(unwrap(this).cells);\n    },\n\n    insertCell: function(index) {\n      return wrap(unwrap(this).insertCell(index));\n    }\n  });\n\n  registerWrapper(OriginalHTMLTableRowElement, HTMLTableRowElement,\n                  document.createElement('tr'));\n\n  scope.wrappers.HTMLTableRowElement = HTMLTableRowElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLContentElement = scope.wrappers.HTMLContentElement;\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var HTMLShadowElement = scope.wrappers.HTMLShadowElement;\n  var HTMLTemplateElement = scope.wrappers.HTMLTemplateElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLUnknownElement = window.HTMLUnknownElement;\n\n  function HTMLUnknownElement(node) {\n    switch (node.localName) {\n      case 'content':\n        return new HTMLContentElement(node);\n      case 'shadow':\n        return new HTMLShadowElement(node);\n      case 'template':\n        return new HTMLTemplateElement(node);\n    }\n    HTMLElement.call(this, node);\n  }\n  HTMLUnknownElement.prototype = Object.create(HTMLElement.prototype);\n  registerWrapper(OriginalHTMLUnknownElement, HTMLUnknownElement);\n  scope.wrappers.HTMLUnknownElement = HTMLUnknownElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var registerObject = scope.registerObject;\n\n  var SVG_NS = 'http://www.w3.org/2000/svg';\n  var svgTitleElement = document.createElementNS(SVG_NS, 'title');\n  var SVGTitleElement = registerObject(svgTitleElement);\n  var SVGElement = Object.getPrototypeOf(SVGTitleElement.prototype).constructor;\n\n  scope.wrappers.SVGElement = SVGElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalSVGUseElement = window.SVGUseElement;\n\n  // IE uses SVGElement as parent interface, SVG2 (Blink & Gecko) uses\n  // SVGGraphicsElement. Use the <g> element to get the right prototype.\n\n  var SVG_NS = 'http://www.w3.org/2000/svg';\n  var gWrapper = wrap(document.createElementNS(SVG_NS, 'g'));\n  var useElement = document.createElementNS(SVG_NS, 'use');\n  var SVGGElement = gWrapper.constructor;\n  var parentInterfacePrototype = Object.getPrototypeOf(SVGGElement.prototype);\n  var parentInterface = parentInterfacePrototype.constructor;\n\n  function SVGUseElement(impl) {\n    parentInterface.call(this, impl);\n  }\n\n  SVGUseElement.prototype = Object.create(parentInterfacePrototype);\n\n  // Firefox does not expose instanceRoot.\n  if ('instanceRoot' in useElement) {\n    mixin(SVGUseElement.prototype, {\n      get instanceRoot() {\n        return wrap(unwrap(this).instanceRoot);\n      },\n      get animatedInstanceRoot() {\n        return wrap(unwrap(this).animatedInstanceRoot);\n      },\n    });\n  }\n\n  registerWrapper(OriginalSVGUseElement, SVGUseElement, useElement);\n\n  scope.wrappers.SVGUseElement = SVGUseElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var EventTarget = scope.wrappers.EventTarget;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrap = scope.wrap;\n\n  var OriginalSVGElementInstance = window.SVGElementInstance;\n  if (!OriginalSVGElementInstance)\n    return;\n\n  function SVGElementInstance(impl) {\n    EventTarget.call(this, impl);\n  }\n\n  SVGElementInstance.prototype = Object.create(EventTarget.prototype);\n  mixin(SVGElementInstance.prototype, {\n    /** @type {SVGElement} */\n    get correspondingElement() {\n      return wrap(this.impl.correspondingElement);\n    },\n\n    /** @type {SVGUseElement} */\n    get correspondingUseElement() {\n      return wrap(this.impl.correspondingUseElement);\n    },\n\n    /** @type {SVGElementInstance} */\n    get parentNode() {\n      return wrap(this.impl.parentNode);\n    },\n\n    /** @type {SVGElementInstanceList} */\n    get childNodes() {\n      throw new Error('Not implemented');\n    },\n\n    /** @type {SVGElementInstance} */\n    get firstChild() {\n      return wrap(this.impl.firstChild);\n    },\n\n    /** @type {SVGElementInstance} */\n    get lastChild() {\n      return wrap(this.impl.lastChild);\n    },\n\n    /** @type {SVGElementInstance} */\n    get previousSibling() {\n      return wrap(this.impl.previousSibling);\n    },\n\n    /** @type {SVGElementInstance} */\n    get nextSibling() {\n      return wrap(this.impl.nextSibling);\n    }\n  });\n\n  registerWrapper(OriginalSVGElementInstance, SVGElementInstance);\n\n  scope.wrappers.SVGElementInstance = SVGElementInstance;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalCanvasRenderingContext2D = window.CanvasRenderingContext2D;\n\n  function CanvasRenderingContext2D(impl) {\n    this.impl = impl;\n  }\n\n  mixin(CanvasRenderingContext2D.prototype, {\n    get canvas() {\n      return wrap(this.impl.canvas);\n    },\n\n    drawImage: function() {\n      arguments[0] = unwrapIfNeeded(arguments[0]);\n      this.impl.drawImage.apply(this.impl, arguments);\n    },\n\n    createPattern: function() {\n      arguments[0] = unwrap(arguments[0]);\n      return this.impl.createPattern.apply(this.impl, arguments);\n    }\n  });\n\n  registerWrapper(OriginalCanvasRenderingContext2D, CanvasRenderingContext2D,\n                  document.createElement('canvas').getContext('2d'));\n\n  scope.wrappers.CanvasRenderingContext2D = CanvasRenderingContext2D;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalWebGLRenderingContext = window.WebGLRenderingContext;\n\n  // IE10 does not have WebGL.\n  if (!OriginalWebGLRenderingContext)\n    return;\n\n  function WebGLRenderingContext(impl) {\n    this.impl = impl;\n  }\n\n  mixin(WebGLRenderingContext.prototype, {\n    get canvas() {\n      return wrap(this.impl.canvas);\n    },\n\n    texImage2D: function() {\n      arguments[5] = unwrapIfNeeded(arguments[5]);\n      this.impl.texImage2D.apply(this.impl, arguments);\n    },\n\n    texSubImage2D: function() {\n      arguments[6] = unwrapIfNeeded(arguments[6]);\n      this.impl.texSubImage2D.apply(this.impl, arguments);\n    }\n  });\n\n  // Blink/WebKit has broken DOM bindings. Usually we would create an instance\n  // of the object and pass it into registerWrapper as a \"blueprint\" but\n  // creating WebGL contexts is expensive and might fail so we use a dummy\n  // object with dummy instance properties for these broken browsers.\n  var instanceProperties = /WebKit/.test(navigator.userAgent) ?\n      {drawingBufferHeight: null, drawingBufferWidth: null} : {};\n\n  registerWrapper(OriginalWebGLRenderingContext, WebGLRenderingContext,\n      instanceProperties);\n\n  scope.wrappers.WebGLRenderingContext = WebGLRenderingContext;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalRange = window.Range;\n\n  function Range(impl) {\n    this.impl = impl;\n  }\n  Range.prototype = {\n    get startContainer() {\n      return wrap(this.impl.startContainer);\n    },\n    get endContainer() {\n      return wrap(this.impl.endContainer);\n    },\n    get commonAncestorContainer() {\n      return wrap(this.impl.commonAncestorContainer);\n    },\n    setStart: function(refNode,offset) {\n      this.impl.setStart(unwrapIfNeeded(refNode), offset);\n    },\n    setEnd: function(refNode,offset) {\n      this.impl.setEnd(unwrapIfNeeded(refNode), offset);\n    },\n    setStartBefore: function(refNode) {\n      this.impl.setStartBefore(unwrapIfNeeded(refNode));\n    },\n    setStartAfter: function(refNode) {\n      this.impl.setStartAfter(unwrapIfNeeded(refNode));\n    },\n    setEndBefore: function(refNode) {\n      this.impl.setEndBefore(unwrapIfNeeded(refNode));\n    },\n    setEndAfter: function(refNode) {\n      this.impl.setEndAfter(unwrapIfNeeded(refNode));\n    },\n    selectNode: function(refNode) {\n      this.impl.selectNode(unwrapIfNeeded(refNode));\n    },\n    selectNodeContents: function(refNode) {\n      this.impl.selectNodeContents(unwrapIfNeeded(refNode));\n    },\n    compareBoundaryPoints: function(how, sourceRange) {\n      return this.impl.compareBoundaryPoints(how, unwrap(sourceRange));\n    },\n    extractContents: function() {\n      return wrap(this.impl.extractContents());\n    },\n    cloneContents: function() {\n      return wrap(this.impl.cloneContents());\n    },\n    insertNode: function(node) {\n      this.impl.insertNode(unwrapIfNeeded(node));\n    },\n    surroundContents: function(newParent) {\n      this.impl.surroundContents(unwrapIfNeeded(newParent));\n    },\n    cloneRange: function() {\n      return wrap(this.impl.cloneRange());\n    },\n    isPointInRange: function(node, offset) {\n      return this.impl.isPointInRange(unwrapIfNeeded(node), offset);\n    },\n    comparePoint: function(node, offset) {\n      return this.impl.comparePoint(unwrapIfNeeded(node), offset);\n    },\n    intersectsNode: function(node) {\n      return this.impl.intersectsNode(unwrapIfNeeded(node));\n    },\n    toString: function() {\n      return this.impl.toString();\n    }\n  };\n\n  // IE9 does not have createContextualFragment.\n  if (OriginalRange.prototype.createContextualFragment) {\n    Range.prototype.createContextualFragment = function(html) {\n      return wrap(this.impl.createContextualFragment(html));\n    };\n  }\n\n  registerWrapper(window.Range, Range, document.createRange());\n\n  scope.wrappers.Range = Range;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var GetElementsByInterface = scope.GetElementsByInterface;\n  var ParentNodeInterface = scope.ParentNodeInterface;\n  var SelectorsInterface = scope.SelectorsInterface;\n  var mixin = scope.mixin;\n  var registerObject = scope.registerObject;\n\n  var DocumentFragment = registerObject(document.createDocumentFragment());\n  mixin(DocumentFragment.prototype, ParentNodeInterface);\n  mixin(DocumentFragment.prototype, SelectorsInterface);\n  mixin(DocumentFragment.prototype, GetElementsByInterface);\n\n  var Comment = registerObject(document.createComment(''));\n\n  scope.wrappers.Comment = Comment;\n  scope.wrappers.DocumentFragment = DocumentFragment;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var DocumentFragment = scope.wrappers.DocumentFragment;\n  var TreeScope = scope.TreeScope;\n  var elementFromPoint = scope.elementFromPoint;\n  var getInnerHTML = scope.getInnerHTML;\n  var getTreeScope = scope.getTreeScope;\n  var mixin = scope.mixin;\n  var rewrap = scope.rewrap;\n  var setInnerHTML = scope.setInnerHTML;\n  var unwrap = scope.unwrap;\n\n  var shadowHostTable = new WeakMap();\n  var nextOlderShadowTreeTable = new WeakMap();\n\n  var spaceCharRe = /[ \\t\\n\\r\\f]/;\n\n  function ShadowRoot(hostWrapper) {\n    var node = unwrap(hostWrapper.impl.ownerDocument.createDocumentFragment());\n    DocumentFragment.call(this, node);\n\n    // createDocumentFragment associates the node with a wrapper\n    // DocumentFragment instance. Override that.\n    rewrap(node, this);\n\n    this.treeScope_ = new TreeScope(this, getTreeScope(hostWrapper));\n\n    var oldShadowRoot = hostWrapper.shadowRoot;\n    nextOlderShadowTreeTable.set(this, oldShadowRoot);\n\n    shadowHostTable.set(this, hostWrapper);\n  }\n  ShadowRoot.prototype = Object.create(DocumentFragment.prototype);\n  mixin(ShadowRoot.prototype, {\n    get innerHTML() {\n      return getInnerHTML(this);\n    },\n    set innerHTML(value) {\n      setInnerHTML(this, value);\n      this.invalidateShadowRenderer();\n    },\n\n    get olderShadowRoot() {\n      return nextOlderShadowTreeTable.get(this) || null;\n    },\n\n    get host() {\n      return shadowHostTable.get(this) || null;\n    },\n\n    invalidateShadowRenderer: function() {\n      return shadowHostTable.get(this).invalidateShadowRenderer();\n    },\n\n    elementFromPoint: function(x, y) {\n      return elementFromPoint(this, this.ownerDocument, x, y);\n    },\n\n    getElementById: function(id) {\n      if (spaceCharRe.test(id))\n        return null;\n      return this.querySelector('[id=\"' + id + '\"]');\n    }\n  });\n\n  scope.wrappers.ShadowRoot = ShadowRoot;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var Element = scope.wrappers.Element;\n  var HTMLContentElement = scope.wrappers.HTMLContentElement;\n  var HTMLShadowElement = scope.wrappers.HTMLShadowElement;\n  var Node = scope.wrappers.Node;\n  var ShadowRoot = scope.wrappers.ShadowRoot;\n  var assert = scope.assert;\n  var getTreeScope = scope.getTreeScope;\n  var mixin = scope.mixin;\n  var oneOf = scope.oneOf;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  /**\n   * Updates the fields of a wrapper to a snapshot of the logical DOM as needed.\n   * Up means parentNode\n   * Sideways means previous and next sibling.\n   * @param {!Node} wrapper\n   */\n  function updateWrapperUpAndSideways(wrapper) {\n    wrapper.previousSibling_ = wrapper.previousSibling;\n    wrapper.nextSibling_ = wrapper.nextSibling;\n    wrapper.parentNode_ = wrapper.parentNode;\n  }\n\n  /**\n   * Updates the fields of a wrapper to a snapshot of the logical DOM as needed.\n   * Down means first and last child\n   * @param {!Node} wrapper\n   */\n  function updateWrapperDown(wrapper) {\n    wrapper.firstChild_ = wrapper.firstChild;\n    wrapper.lastChild_ = wrapper.lastChild;\n  }\n\n  function updateAllChildNodes(parentNodeWrapper) {\n    assert(parentNodeWrapper instanceof Node);\n    for (var childWrapper = parentNodeWrapper.firstChild;\n         childWrapper;\n         childWrapper = childWrapper.nextSibling) {\n      updateWrapperUpAndSideways(childWrapper);\n    }\n    updateWrapperDown(parentNodeWrapper);\n  }\n\n  function insertBefore(parentNodeWrapper, newChildWrapper, refChildWrapper) {\n    var parentNode = unwrap(parentNodeWrapper);\n    var newChild = unwrap(newChildWrapper);\n    var refChild = refChildWrapper ? unwrap(refChildWrapper) : null;\n\n    remove(newChildWrapper);\n    updateWrapperUpAndSideways(newChildWrapper);\n\n    if (!refChildWrapper) {\n      parentNodeWrapper.lastChild_ = parentNodeWrapper.lastChild;\n      if (parentNodeWrapper.lastChild === parentNodeWrapper.firstChild)\n        parentNodeWrapper.firstChild_ = parentNodeWrapper.firstChild;\n\n      var lastChildWrapper = wrap(parentNode.lastChild);\n      if (lastChildWrapper)\n        lastChildWrapper.nextSibling_ = lastChildWrapper.nextSibling;\n    } else {\n      if (parentNodeWrapper.firstChild === refChildWrapper)\n        parentNodeWrapper.firstChild_ = refChildWrapper;\n\n      refChildWrapper.previousSibling_ = refChildWrapper.previousSibling;\n    }\n\n    parentNode.insertBefore(newChild, refChild);\n  }\n\n  function remove(nodeWrapper) {\n    var node = unwrap(nodeWrapper)\n    var parentNode = node.parentNode;\n    if (!parentNode)\n      return;\n\n    var parentNodeWrapper = wrap(parentNode);\n    updateWrapperUpAndSideways(nodeWrapper);\n\n    if (nodeWrapper.previousSibling)\n      nodeWrapper.previousSibling.nextSibling_ = nodeWrapper;\n    if (nodeWrapper.nextSibling)\n      nodeWrapper.nextSibling.previousSibling_ = nodeWrapper;\n\n    if (parentNodeWrapper.lastChild === nodeWrapper)\n      parentNodeWrapper.lastChild_ = nodeWrapper;\n    if (parentNodeWrapper.firstChild === nodeWrapper)\n      parentNodeWrapper.firstChild_ = nodeWrapper;\n\n    parentNode.removeChild(node);\n  }\n\n  var distributedChildNodesTable = new WeakMap();\n  var eventParentsTable = new WeakMap();\n  var insertionParentTable = new WeakMap();\n  var rendererForHostTable = new WeakMap();\n\n  function distributeChildToInsertionPoint(child, insertionPoint) {\n    getDistributedChildNodes(insertionPoint).push(child);\n    assignToInsertionPoint(child, insertionPoint);\n\n    var eventParents = eventParentsTable.get(child);\n    if (!eventParents)\n      eventParentsTable.set(child, eventParents = []);\n    eventParents.push(insertionPoint);\n  }\n\n  function resetDistributedChildNodes(insertionPoint) {\n    distributedChildNodesTable.set(insertionPoint, []);\n  }\n\n  function getDistributedChildNodes(insertionPoint) {\n    var rv = distributedChildNodesTable.get(insertionPoint);\n    if (!rv)\n      distributedChildNodesTable.set(insertionPoint, rv = []);\n    return rv;\n  }\n\n  function getChildNodesSnapshot(node) {\n    var result = [], i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      result[i++] = child;\n    }\n    return result;\n  }\n\n  /**\n   * Visits all nodes in the tree that fulfils the |predicate|. If the |visitor|\n   * function returns |false| the traversal is aborted.\n   * @param {!Node} tree\n   * @param {function(!Node) : boolean} predicate\n   * @param {function(!Node) : *} visitor\n   */\n  function visit(tree, predicate, visitor) {\n    // This operates on logical DOM.\n    for (var node = tree.firstChild; node; node = node.nextSibling) {\n      if (predicate(node)) {\n        if (visitor(node) === false)\n          return;\n      } else {\n        visit(node, predicate, visitor);\n      }\n    }\n  }\n\n  // Matching Insertion Points\n  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#matching-insertion-points\n\n  // TODO(arv): Verify this... I don't remember why I picked this regexp.\n  var selectorMatchRegExp = /^[*.:#[a-zA-Z_|]/;\n\n  var allowedPseudoRegExp = new RegExp('^:(' + [\n    'link',\n    'visited',\n    'target',\n    'enabled',\n    'disabled',\n    'checked',\n    'indeterminate',\n    'nth-child',\n    'nth-last-child',\n    'nth-of-type',\n    'nth-last-of-type',\n    'first-child',\n    'last-child',\n    'first-of-type',\n    'last-of-type',\n    'only-of-type',\n  ].join('|') + ')');\n\n\n  /**\n   * @param {Element} node\n   * @oaram {Element} point The insertion point element.\n   * @return {boolean} Whether the node matches the insertion point.\n   */\n  function matchesCriteria(node, point) {\n    var select = point.getAttribute('select');\n    if (!select)\n      return true;\n\n    // Here we know the select attribute is a non empty string.\n    select = select.trim();\n    if (!select)\n      return true;\n\n    if (!(node instanceof Element))\n      return false;\n\n    // The native matches function in IE9 does not correctly work with elements\n    // that are not in the document.\n    // TODO(arv): Implement matching in JS.\n    // https://github.com/Polymer/ShadowDOM/issues/361\n    if (select === '*' || select === node.localName)\n      return true;\n\n    // TODO(arv): This does not seem right. Need to check for a simple selector.\n    if (!selectorMatchRegExp.test(select))\n      return false;\n\n    // TODO(arv): This no longer matches the spec.\n    if (select[0] === ':' && !allowedPseudoRegExp.test(select))\n      return false;\n\n    try {\n      return node.matches(select);\n    } catch (ex) {\n      // Invalid selector.\n      return false;\n    }\n  }\n\n  var request = oneOf(window, [\n    'requestAnimationFrame',\n    'mozRequestAnimationFrame',\n    'webkitRequestAnimationFrame',\n    'setTimeout'\n  ]);\n\n  var pendingDirtyRenderers = [];\n  var renderTimer;\n\n  function renderAllPending() {\n    // TODO(arv): Order these in document order. That way we do not have to\n    // render something twice.\n    for (var i = 0; i < pendingDirtyRenderers.length; i++) {\n      var renderer = pendingDirtyRenderers[i];\n      var parentRenderer = renderer.parentRenderer;\n      if (parentRenderer && parentRenderer.dirty)\n        continue;\n      renderer.render();\n    }\n\n    pendingDirtyRenderers = [];\n  }\n\n  function handleRequestAnimationFrame() {\n    renderTimer = null;\n    renderAllPending();\n  }\n\n  /**\n   * Returns existing shadow renderer for a host or creates it if it is needed.\n   * @params {!Element} host\n   * @return {!ShadowRenderer}\n   */\n  function getRendererForHost(host) {\n    var renderer = rendererForHostTable.get(host);\n    if (!renderer) {\n      renderer = new ShadowRenderer(host);\n      rendererForHostTable.set(host, renderer);\n    }\n    return renderer;\n  }\n\n  function getShadowRootAncestor(node) {\n    var root = getTreeScope(node).root;\n    if (root instanceof ShadowRoot)\n      return root;\n    return null;\n  }\n\n  function getRendererForShadowRoot(shadowRoot) {\n    return getRendererForHost(shadowRoot.host);\n  }\n\n  var spliceDiff = new ArraySplice();\n  spliceDiff.equals = function(renderNode, rawNode) {\n    return unwrap(renderNode.node) === rawNode;\n  };\n\n  /**\n   * RenderNode is used as an in memory \"render tree\". When we render the\n   * composed tree we create a tree of RenderNodes, then we diff this against\n   * the real DOM tree and make minimal changes as needed.\n   */\n  function RenderNode(node) {\n    this.skip = false;\n    this.node = node;\n    this.childNodes = [];\n  }\n\n  RenderNode.prototype = {\n    append: function(node) {\n      var rv = new RenderNode(node);\n      this.childNodes.push(rv);\n      return rv;\n    },\n\n    sync: function(opt_added) {\n      if (this.skip)\n        return;\n\n      var nodeWrapper = this.node;\n      // plain array of RenderNodes\n      var newChildren = this.childNodes;\n      // plain array of real nodes.\n      var oldChildren = getChildNodesSnapshot(unwrap(nodeWrapper));\n      var added = opt_added || new WeakMap();\n\n      var splices = spliceDiff.calculateSplices(newChildren, oldChildren);\n\n      var newIndex = 0, oldIndex = 0;\n      var lastIndex = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        for (; lastIndex < splice.index; lastIndex++) {\n          oldIndex++;\n          newChildren[newIndex++].sync(added);\n        }\n\n        var removedCount = splice.removed.length;\n        for (var j = 0; j < removedCount; j++) {\n          var wrapper = wrap(oldChildren[oldIndex++]);\n          if (!added.get(wrapper))\n            remove(wrapper);\n        }\n\n        var addedCount = splice.addedCount;\n        var refNode = oldChildren[oldIndex] && wrap(oldChildren[oldIndex]);\n        for (var j = 0; j < addedCount; j++) {\n          var newChildRenderNode = newChildren[newIndex++];\n          var newChildWrapper = newChildRenderNode.node;\n          insertBefore(nodeWrapper, newChildWrapper, refNode);\n\n          // Keep track of added so that we do not remove the node after it\n          // has been added.\n          added.set(newChildWrapper, true);\n\n          newChildRenderNode.sync(added);\n        }\n\n        lastIndex += addedCount;\n      }\n\n      for (var i = lastIndex; i < newChildren.length; i++) {\n        newChildren[i].sync(added);\n      }\n    }\n  };\n\n  function ShadowRenderer(host) {\n    this.host = host;\n    this.dirty = false;\n    this.invalidateAttributes();\n    this.associateNode(host);\n  }\n\n  ShadowRenderer.prototype = {\n\n    // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#rendering-shadow-trees\n    render: function(opt_renderNode) {\n      if (!this.dirty)\n        return;\n\n      this.invalidateAttributes();\n      this.treeComposition();\n\n      var host = this.host;\n      var shadowRoot = host.shadowRoot;\n\n      this.associateNode(host);\n      var topMostRenderer = !renderNode;\n      var renderNode = opt_renderNode || new RenderNode(host);\n\n      for (var node = shadowRoot.firstChild; node; node = node.nextSibling) {\n        this.renderNode(shadowRoot, renderNode, node, false);\n      }\n\n      if (topMostRenderer)\n        renderNode.sync();\n\n      this.dirty = false;\n    },\n\n    get parentRenderer() {\n      return getTreeScope(this.host).renderer;\n    },\n\n    invalidate: function() {\n      if (!this.dirty) {\n        this.dirty = true;\n        pendingDirtyRenderers.push(this);\n        if (renderTimer)\n          return;\n        renderTimer = window[request](handleRequestAnimationFrame, 0);\n      }\n    },\n\n    renderNode: function(shadowRoot, renderNode, node, isNested) {\n      if (isShadowHost(node)) {\n        renderNode = renderNode.append(node);\n        var renderer = getRendererForHost(node);\n        renderer.dirty = true;  // Need to rerender due to reprojection.\n        renderer.render(renderNode);\n      } else if (isInsertionPoint(node)) {\n        this.renderInsertionPoint(shadowRoot, renderNode, node, isNested);\n      } else if (isShadowInsertionPoint(node)) {\n        this.renderShadowInsertionPoint(shadowRoot, renderNode, node);\n      } else {\n        this.renderAsAnyDomTree(shadowRoot, renderNode, node, isNested);\n      }\n    },\n\n    renderAsAnyDomTree: function(shadowRoot, renderNode, node, isNested) {\n      renderNode = renderNode.append(node);\n\n      if (isShadowHost(node)) {\n        var renderer = getRendererForHost(node);\n        renderNode.skip = !renderer.dirty;\n        renderer.render(renderNode);\n      } else {\n        for (var child = node.firstChild; child; child = child.nextSibling) {\n          this.renderNode(shadowRoot, renderNode, child, isNested);\n        }\n      }\n    },\n\n    renderInsertionPoint: function(shadowRoot, renderNode, insertionPoint,\n                                   isNested) {\n      var distributedChildNodes = getDistributedChildNodes(insertionPoint);\n      if (distributedChildNodes.length) {\n        this.associateNode(insertionPoint);\n\n        for (var i = 0; i < distributedChildNodes.length; i++) {\n          var child = distributedChildNodes[i];\n          if (isInsertionPoint(child) && isNested)\n            this.renderInsertionPoint(shadowRoot, renderNode, child, isNested);\n          else\n            this.renderAsAnyDomTree(shadowRoot, renderNode, child, isNested);\n        }\n      } else {\n        this.renderFallbackContent(shadowRoot, renderNode, insertionPoint);\n      }\n      this.associateNode(insertionPoint.parentNode);\n    },\n\n    renderShadowInsertionPoint: function(shadowRoot, renderNode,\n                                         shadowInsertionPoint) {\n      var nextOlderTree = shadowRoot.olderShadowRoot;\n      if (nextOlderTree) {\n        assignToInsertionPoint(nextOlderTree, shadowInsertionPoint);\n        this.associateNode(shadowInsertionPoint.parentNode);\n        for (var node = nextOlderTree.firstChild;\n             node;\n             node = node.nextSibling) {\n          this.renderNode(nextOlderTree, renderNode, node, true);\n        }\n      } else {\n        this.renderFallbackContent(shadowRoot, renderNode,\n                                   shadowInsertionPoint);\n      }\n    },\n\n    renderFallbackContent: function(shadowRoot, renderNode, fallbackHost) {\n      this.associateNode(fallbackHost);\n      this.associateNode(fallbackHost.parentNode);\n      for (var node = fallbackHost.firstChild; node; node = node.nextSibling) {\n        this.renderAsAnyDomTree(shadowRoot, renderNode, node, false);\n      }\n    },\n\n    /**\n     * Invalidates the attributes used to keep track of which attributes may\n     * cause the renderer to be invalidated.\n     */\n    invalidateAttributes: function() {\n      this.attributes = Object.create(null);\n    },\n\n    /**\n     * Parses the selector and makes this renderer dependent on the attribute\n     * being used in the selector.\n     * @param {string} selector\n     */\n    updateDependentAttributes: function(selector) {\n      if (!selector)\n        return;\n\n      var attributes = this.attributes;\n\n      // .class\n      if (/\\.\\w+/.test(selector))\n        attributes['class'] = true;\n\n      // #id\n      if (/#\\w+/.test(selector))\n        attributes['id'] = true;\n\n      selector.replace(/\\[\\s*([^\\s=\\|~\\]]+)/g, function(_, name) {\n        attributes[name] = true;\n      });\n\n      // Pseudo selectors have been removed from the spec.\n    },\n\n    dependsOnAttribute: function(name) {\n      return this.attributes[name];\n    },\n\n    // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#dfn-distribution-algorithm\n    distribute: function(tree, pool) {\n      var self = this;\n\n      visit(tree, isActiveInsertionPoint,\n          function(insertionPoint) {\n            resetDistributedChildNodes(insertionPoint);\n            self.updateDependentAttributes(\n                insertionPoint.getAttribute('select'));\n\n            for (var i = 0; i < pool.length; i++) {  // 1.2\n              var node = pool[i];  // 1.2.1\n              if (node === undefined)  // removed\n                continue;\n              if (matchesCriteria(node, insertionPoint)) {  // 1.2.2\n                distributeChildToInsertionPoint(node, insertionPoint);  // 1.2.2.1\n                pool[i] = undefined;  // 1.2.2.2\n              }\n            }\n          });\n    },\n\n    // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#dfn-tree-composition\n    treeComposition: function () {\n      var shadowHost = this.host;\n      var tree = shadowHost.shadowRoot;  // 1.\n      var pool = [];  // 2.\n\n      for (var child = shadowHost.firstChild;\n           child;\n           child = child.nextSibling) {  // 3.\n        if (isInsertionPoint(child)) {  // 3.2.\n          var reprojected = getDistributedChildNodes(child);  // 3.2.1.\n          // if reprojected is undef... reset it?\n          if (!reprojected || !reprojected.length)  // 3.2.2.\n            reprojected = getChildNodesSnapshot(child);\n          pool.push.apply(pool, reprojected);  // 3.2.3.\n        } else {\n          pool.push(child); // 3.3.\n        }\n      }\n\n      var shadowInsertionPoint, point;\n      while (tree) {  // 4.\n        // 4.1.\n        shadowInsertionPoint = undefined;  // Reset every iteration.\n        visit(tree, isActiveShadowInsertionPoint, function(point) {\n          shadowInsertionPoint = point;\n          return false;\n        });\n        point = shadowInsertionPoint;\n\n        this.distribute(tree, pool);  // 4.2.\n        if (point) {  // 4.3.\n          var nextOlderTree = tree.olderShadowRoot;  // 4.3.1.\n          if (!nextOlderTree) {\n            break;  // 4.3.1.1.\n          } else {\n            tree = nextOlderTree;  // 4.3.2.2.\n            assignToInsertionPoint(tree, point);  // 4.3.2.2.\n            continue;  // 4.3.2.3.\n          }\n        } else {\n          break;  // 4.4.\n        }\n      }\n    },\n\n    associateNode: function(node) {\n      node.impl.polymerShadowRenderer_ = this;\n    }\n  };\n\n  function isInsertionPoint(node) {\n    // Should this include <shadow>?\n    return node instanceof HTMLContentElement;\n  }\n\n  function isActiveInsertionPoint(node) {\n    // <content> inside another <content> or <shadow> is considered inactive.\n    return node instanceof HTMLContentElement;\n  }\n\n  function isShadowInsertionPoint(node) {\n    return node instanceof HTMLShadowElement;\n  }\n\n  function isActiveShadowInsertionPoint(node) {\n    // <shadow> inside another <content> or <shadow> is considered inactive.\n    return node instanceof HTMLShadowElement;\n  }\n\n  function isShadowHost(shadowHost) {\n    return shadowHost.shadowRoot;\n  }\n\n  function getShadowTrees(host) {\n    var trees = [];\n\n    for (var tree = host.shadowRoot; tree; tree = tree.olderShadowRoot) {\n      trees.push(tree);\n    }\n    return trees;\n  }\n\n  function assignToInsertionPoint(tree, point) {\n    insertionParentTable.set(tree, point);\n  }\n\n  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#rendering-shadow-trees\n  function render(host) {\n    new ShadowRenderer(host).render();\n  };\n\n  // Need to rerender shadow host when:\n  //\n  // - a direct child to the ShadowRoot is added or removed\n  // - a direct child to the host is added or removed\n  // - a new shadow root is created\n  // - a direct child to a content/shadow element is added or removed\n  // - a sibling to a content/shadow element is added or removed\n  // - content[select] is changed\n  // - an attribute in a direct child to a host is modified\n\n  /**\n   * This gets called when a node was added or removed to it.\n   */\n  Node.prototype.invalidateShadowRenderer = function(force) {\n    var renderer = this.impl.polymerShadowRenderer_;\n    if (renderer) {\n      renderer.invalidate();\n      return true;\n    }\n\n    return false;\n  };\n\n  HTMLContentElement.prototype.getDistributedNodes = function() {\n    // TODO(arv): We should only rerender the dirty ancestor renderers (from\n    // the root and down).\n    renderAllPending();\n    return getDistributedChildNodes(this);\n  };\n\n  HTMLShadowElement.prototype.nodeIsInserted_ =\n  HTMLContentElement.prototype.nodeIsInserted_ = function() {\n    // Invalidate old renderer if any.\n    this.invalidateShadowRenderer();\n\n    var shadowRoot = getShadowRootAncestor(this);\n    var renderer;\n    if (shadowRoot)\n      renderer = getRendererForShadowRoot(shadowRoot);\n    this.impl.polymerShadowRenderer_ = renderer;\n    if (renderer)\n      renderer.invalidate();\n  };\n\n  scope.eventParentsTable = eventParentsTable;\n  scope.getRendererForHost = getRendererForHost;\n  scope.getShadowTrees = getShadowTrees;\n  scope.insertionParentTable = insertionParentTable;\n  scope.renderAllPending = renderAllPending;\n\n  // Exposed for testing\n  scope.visual = {\n    insertBefore: insertBefore,\n    remove: remove,\n  };\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var assert = scope.assert;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var elementsWithFormProperty = [\n    'HTMLButtonElement',\n    'HTMLFieldSetElement',\n    'HTMLInputElement',\n    'HTMLKeygenElement',\n    'HTMLLabelElement',\n    'HTMLLegendElement',\n    'HTMLObjectElement',\n    // HTMLOptionElement is handled in HTMLOptionElement.js\n    'HTMLOutputElement',\n    // HTMLSelectElement is handled in HTMLSelectElement.js\n    'HTMLTextAreaElement',\n  ];\n\n  function createWrapperConstructor(name) {\n    if (!window[name])\n      return;\n\n    // Ensure we are not overriding an already existing constructor.\n    assert(!scope.wrappers[name]);\n\n    var GeneratedWrapper = function(node) {\n      // At this point all of them extend HTMLElement.\n      HTMLElement.call(this, node);\n    }\n    GeneratedWrapper.prototype = Object.create(HTMLElement.prototype);\n    mixin(GeneratedWrapper.prototype, {\n      get form() {\n        return wrap(unwrap(this).form);\n      },\n    });\n\n    registerWrapper(window[name], GeneratedWrapper,\n        document.createElement(name.slice(4, -7)));\n    scope.wrappers[name] = GeneratedWrapper;\n  }\n\n  elementsWithFormProperty.forEach(createWrapperConstructor);\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalSelection = window.Selection;\n\n  function Selection(impl) {\n    this.impl = impl;\n  }\n  Selection.prototype = {\n    get anchorNode() {\n      return wrap(this.impl.anchorNode);\n    },\n    get focusNode() {\n      return wrap(this.impl.focusNode);\n    },\n    addRange: function(range) {\n      this.impl.addRange(unwrap(range));\n    },\n    collapse: function(node, index) {\n      this.impl.collapse(unwrapIfNeeded(node), index);\n    },\n    containsNode: function(node, allowPartial) {\n      return this.impl.containsNode(unwrapIfNeeded(node), allowPartial);\n    },\n    extend: function(node, offset) {\n      this.impl.extend(unwrapIfNeeded(node), offset);\n    },\n    getRangeAt: function(index) {\n      return wrap(this.impl.getRangeAt(index));\n    },\n    removeRange: function(range) {\n      this.impl.removeRange(unwrap(range));\n    },\n    selectAllChildren: function(node) {\n      this.impl.selectAllChildren(unwrapIfNeeded(node));\n    },\n    toString: function() {\n      return this.impl.toString();\n    }\n  };\n\n  // WebKit extensions. Not implemented.\n  // readonly attribute Node baseNode;\n  // readonly attribute long baseOffset;\n  // readonly attribute Node extentNode;\n  // readonly attribute long extentOffset;\n  // [RaisesException] void setBaseAndExtent([Default=Undefined] optional Node baseNode,\n  //                       [Default=Undefined] optional long baseOffset,\n  //                       [Default=Undefined] optional Node extentNode,\n  //                       [Default=Undefined] optional long extentOffset);\n  // [RaisesException, ImplementedAs=collapse] void setPosition([Default=Undefined] optional Node node,\n  //                  [Default=Undefined] optional long offset);\n\n  registerWrapper(window.Selection, Selection, window.getSelection());\n\n  scope.wrappers.Selection = Selection;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var GetElementsByInterface = scope.GetElementsByInterface;\n  var Node = scope.wrappers.Node;\n  var ParentNodeInterface = scope.ParentNodeInterface;\n  var Selection = scope.wrappers.Selection;\n  var SelectorsInterface = scope.SelectorsInterface;\n  var ShadowRoot = scope.wrappers.ShadowRoot;\n  var TreeScope = scope.TreeScope;\n  var cloneNode = scope.cloneNode;\n  var defineWrapGetter = scope.defineWrapGetter;\n  var elementFromPoint = scope.elementFromPoint;\n  var forwardMethodsToWrapper = scope.forwardMethodsToWrapper;\n  var matchesNames = scope.matchesNames;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var renderAllPending = scope.renderAllPending;\n  var rewrap = scope.rewrap;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrapEventTargetMethods = scope.wrapEventTargetMethods;\n  var wrapNodeList = scope.wrapNodeList;\n\n  var implementationTable = new WeakMap();\n\n  function Document(node) {\n    Node.call(this, node);\n    this.treeScope_ = new TreeScope(this, null);\n  }\n  Document.prototype = Object.create(Node.prototype);\n\n  defineWrapGetter(Document, 'documentElement');\n\n  // Conceptually both body and head can be in a shadow but suporting that seems\n  // overkill at this point.\n  defineWrapGetter(Document, 'body');\n  defineWrapGetter(Document, 'head');\n\n  // document cannot be overridden so we override a bunch of its methods\n  // directly on the instance.\n\n  function wrapMethod(name) {\n    var original = document[name];\n    Document.prototype[name] = function() {\n      return wrap(original.apply(this.impl, arguments));\n    };\n  }\n\n  [\n    'createComment',\n    'createDocumentFragment',\n    'createElement',\n    'createElementNS',\n    'createEvent',\n    'createEventNS',\n    'createRange',\n    'createTextNode',\n    'getElementById'\n  ].forEach(wrapMethod);\n\n  var originalAdoptNode = document.adoptNode;\n\n  function adoptNodeNoRemove(node, doc) {\n    originalAdoptNode.call(doc.impl, unwrap(node));\n    adoptSubtree(node, doc);\n  }\n\n  function adoptSubtree(node, doc) {\n    if (node.shadowRoot)\n      doc.adoptNode(node.shadowRoot);\n    if (node instanceof ShadowRoot)\n      adoptOlderShadowRoots(node, doc);\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      adoptSubtree(child, doc);\n    }\n  }\n\n  function adoptOlderShadowRoots(shadowRoot, doc) {\n    var oldShadowRoot = shadowRoot.olderShadowRoot;\n    if (oldShadowRoot)\n      doc.adoptNode(oldShadowRoot);\n  }\n\n  var originalGetSelection = document.getSelection;\n\n  mixin(Document.prototype, {\n    adoptNode: function(node) {\n      if (node.parentNode)\n        node.parentNode.removeChild(node);\n      adoptNodeNoRemove(node, this);\n      return node;\n    },\n    elementFromPoint: function(x, y) {\n      return elementFromPoint(this, this, x, y);\n    },\n    importNode: function(node, deep) {\n      return cloneNode(node, deep, this.impl);\n    },\n    getSelection: function() {\n      renderAllPending();\n      return new Selection(originalGetSelection.call(unwrap(this)));\n    }\n  });\n\n  if (document.registerElement) {\n    var originalRegisterElement = document.registerElement;\n    Document.prototype.registerElement = function(tagName, object) {\n      var prototype, extendsOption;\n      if (object !== undefined) {\n        prototype = object.prototype;\n        extendsOption = object.extends;\n      }\n\n      if (!prototype)\n        prototype = Object.create(HTMLElement.prototype);\n\n\n      // If we already used the object as a prototype for another custom\n      // element.\n      if (scope.nativePrototypeTable.get(prototype)) {\n        // TODO(arv): DOMException\n        throw new Error('NotSupportedError');\n      }\n\n      // Find first object on the prototype chain that already have a native\n      // prototype. Keep track of all the objects before that so we can create\n      // a similar structure for the native case.\n      var proto = Object.getPrototypeOf(prototype);\n      var nativePrototype;\n      var prototypes = [];\n      while (proto) {\n        nativePrototype = scope.nativePrototypeTable.get(proto);\n        if (nativePrototype)\n          break;\n        prototypes.push(proto);\n        proto = Object.getPrototypeOf(proto);\n      }\n\n      if (!nativePrototype) {\n        // TODO(arv): DOMException\n        throw new Error('NotSupportedError');\n      }\n\n      // This works by creating a new prototype object that is empty, but has\n      // the native prototype as its proto. The original prototype object\n      // passed into register is used as the wrapper prototype.\n\n      var newPrototype = Object.create(nativePrototype);\n      for (var i = prototypes.length - 1; i >= 0; i--) {\n        newPrototype = Object.create(newPrototype);\n      }\n\n      // Add callbacks if present.\n      // Names are taken from:\n      //   https://code.google.com/p/chromium/codesearch#chromium/src/third_party/WebKit/Source/bindings/v8/CustomElementConstructorBuilder.cpp&sq=package:chromium&type=cs&l=156\n      // and not from the spec since the spec is out of date.\n      [\n        'createdCallback',\n        'attachedCallback',\n        'detachedCallback',\n        'attributeChangedCallback',\n      ].forEach(function(name) {\n        var f = prototype[name];\n        if (!f)\n          return;\n        newPrototype[name] = function() {\n          // if this element has been wrapped prior to registration,\n          // the wrapper is stale; in this case rewrap\n          if (!(wrap(this) instanceof CustomElementConstructor)) {\n            rewrap(this);\n          }\n          f.apply(wrap(this), arguments);\n        };\n      });\n\n      var p = {prototype: newPrototype};\n      if (extendsOption)\n        p.extends = extendsOption;\n\n      function CustomElementConstructor(node) {\n        if (!node) {\n          if (extendsOption) {\n            return document.createElement(extendsOption, tagName);\n          } else {\n            return document.createElement(tagName);\n          }\n        }\n        this.impl = node;\n      }\n      CustomElementConstructor.prototype = prototype;\n      CustomElementConstructor.prototype.constructor = CustomElementConstructor;\n\n      scope.constructorTable.set(newPrototype, CustomElementConstructor);\n      scope.nativePrototypeTable.set(prototype, newPrototype);\n\n      // registration is synchronous so do it last\n      var nativeConstructor = originalRegisterElement.call(unwrap(this),\n          tagName, p);\n      return CustomElementConstructor;\n    };\n\n    forwardMethodsToWrapper([\n      window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    ], [\n      'registerElement',\n    ]);\n  }\n\n  // We also override some of the methods on document.body and document.head\n  // for convenience.\n  forwardMethodsToWrapper([\n    window.HTMLBodyElement,\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    window.HTMLHeadElement,\n    window.HTMLHtmlElement,\n  ], [\n    'appendChild',\n    'compareDocumentPosition',\n    'contains',\n    'getElementsByClassName',\n    'getElementsByTagName',\n    'getElementsByTagNameNS',\n    'insertBefore',\n    'querySelector',\n    'querySelectorAll',\n    'removeChild',\n    'replaceChild',\n  ].concat(matchesNames));\n\n  forwardMethodsToWrapper([\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n  ], [\n    'adoptNode',\n    'importNode',\n    'contains',\n    'createComment',\n    'createDocumentFragment',\n    'createElement',\n    'createElementNS',\n    'createEvent',\n    'createEventNS',\n    'createRange',\n    'createTextNode',\n    'elementFromPoint',\n    'getElementById',\n    'getSelection',\n  ]);\n\n  mixin(Document.prototype, GetElementsByInterface);\n  mixin(Document.prototype, ParentNodeInterface);\n  mixin(Document.prototype, SelectorsInterface);\n\n  mixin(Document.prototype, {\n    get implementation() {\n      var implementation = implementationTable.get(this);\n      if (implementation)\n        return implementation;\n      implementation =\n          new DOMImplementation(unwrap(this).implementation);\n      implementationTable.set(this, implementation);\n      return implementation;\n    }\n  });\n\n  registerWrapper(window.Document, Document,\n      document.implementation.createHTMLDocument(''));\n\n  // Both WebKit and Gecko uses HTMLDocument for document. HTML5/DOM only has\n  // one Document interface and IE implements the standard correctly.\n  if (window.HTMLDocument)\n    registerWrapper(window.HTMLDocument, Document);\n\n  wrapEventTargetMethods([\n    window.HTMLBodyElement,\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    window.HTMLHeadElement,\n  ]);\n\n  function DOMImplementation(impl) {\n    this.impl = impl;\n  }\n\n  function wrapImplMethod(constructor, name) {\n    var original = document.implementation[name];\n    constructor.prototype[name] = function() {\n      return wrap(original.apply(this.impl, arguments));\n    };\n  }\n\n  function forwardImplMethod(constructor, name) {\n    var original = document.implementation[name];\n    constructor.prototype[name] = function() {\n      return original.apply(this.impl, arguments);\n    };\n  }\n\n  wrapImplMethod(DOMImplementation, 'createDocumentType');\n  wrapImplMethod(DOMImplementation, 'createDocument');\n  wrapImplMethod(DOMImplementation, 'createHTMLDocument');\n  forwardImplMethod(DOMImplementation, 'hasFeature');\n\n  registerWrapper(window.DOMImplementation, DOMImplementation);\n\n  forwardMethodsToWrapper([\n    window.DOMImplementation,\n  ], [\n    'createDocumentType',\n    'createDocument',\n    'createHTMLDocument',\n    'hasFeature',\n  ]);\n\n  scope.adoptNodeNoRemove = adoptNodeNoRemove;\n  scope.wrappers.DOMImplementation = DOMImplementation;\n  scope.wrappers.Document = Document;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var EventTarget = scope.wrappers.EventTarget;\n  var Selection = scope.wrappers.Selection;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var renderAllPending = scope.renderAllPending;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalWindow = window.Window;\n  var originalGetComputedStyle = window.getComputedStyle;\n  var originalGetSelection = window.getSelection;\n\n  function Window(impl) {\n    EventTarget.call(this, impl);\n  }\n  Window.prototype = Object.create(EventTarget.prototype);\n\n  OriginalWindow.prototype.getComputedStyle = function(el, pseudo) {\n    return wrap(this || window).getComputedStyle(unwrapIfNeeded(el), pseudo);\n  };\n\n  OriginalWindow.prototype.getSelection = function() {\n    return wrap(this || window).getSelection();\n  };\n\n  // Work around for https://bugzilla.mozilla.org/show_bug.cgi?id=943065\n  delete window.getComputedStyle;\n  delete window.getSelection;\n\n  ['addEventListener', 'removeEventListener', 'dispatchEvent'].forEach(\n      function(name) {\n        OriginalWindow.prototype[name] = function() {\n          var w = wrap(this || window);\n          return w[name].apply(w, arguments);\n        };\n\n        // Work around for https://bugzilla.mozilla.org/show_bug.cgi?id=943065\n        delete window[name];\n      });\n\n  mixin(Window.prototype, {\n    getComputedStyle: function(el, pseudo) {\n      renderAllPending();\n      return originalGetComputedStyle.call(unwrap(this), unwrapIfNeeded(el),\n                                           pseudo);\n    },\n    getSelection: function() {\n      renderAllPending();\n      return new Selection(originalGetSelection.call(unwrap(this)));\n    },\n  });\n\n  registerWrapper(OriginalWindow, Window);\n\n  scope.wrappers.Window = Window;\n\n})(window.ShadowDOMPolyfill);\n","/**\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var unwrap = scope.unwrap;\n\n  // DataTransfer (Clipboard in old Blink/WebKit) has a single method that\n  // requires wrapping. Since it is only a method we do not need a real wrapper,\n  // we can just override the method.\n\n  var OriginalDataTransfer = window.DataTransfer || window.Clipboard;\n  var OriginalDataTransferSetDragImage =\n      OriginalDataTransfer.prototype.setDragImage;\n\n  OriginalDataTransfer.prototype.setDragImage = function(image, x, y) {\n    OriginalDataTransferSetDragImage.call(this, unwrap(image), x, y);\n  };\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var isWrapperFor = scope.isWrapperFor;\n\n  // This is a list of the elements we currently override the global constructor\n  // for.\n  var elements = {\n    'a': 'HTMLAnchorElement',\n    // Do not create an applet element by default since it shows a warning in\n    // IE.\n    // https://github.com/Polymer/polymer/issues/217\n    // 'applet': 'HTMLAppletElement',\n    'area': 'HTMLAreaElement',\n    'audio': 'HTMLAudioElement',\n    'base': 'HTMLBaseElement',\n    'body': 'HTMLBodyElement',\n    'br': 'HTMLBRElement',\n    'button': 'HTMLButtonElement',\n    'canvas': 'HTMLCanvasElement',\n    'caption': 'HTMLTableCaptionElement',\n    'col': 'HTMLTableColElement',\n    // 'command': 'HTMLCommandElement',  // Not fully implemented in Gecko.\n    'content': 'HTMLContentElement',\n    'data': 'HTMLDataElement',\n    'datalist': 'HTMLDataListElement',\n    'del': 'HTMLModElement',\n    'dir': 'HTMLDirectoryElement',\n    'div': 'HTMLDivElement',\n    'dl': 'HTMLDListElement',\n    'embed': 'HTMLEmbedElement',\n    'fieldset': 'HTMLFieldSetElement',\n    'font': 'HTMLFontElement',\n    'form': 'HTMLFormElement',\n    'frame': 'HTMLFrameElement',\n    'frameset': 'HTMLFrameSetElement',\n    'h1': 'HTMLHeadingElement',\n    'head': 'HTMLHeadElement',\n    'hr': 'HTMLHRElement',\n    'html': 'HTMLHtmlElement',\n    'iframe': 'HTMLIFrameElement',\n    'img': 'HTMLImageElement',\n    'input': 'HTMLInputElement',\n    'keygen': 'HTMLKeygenElement',\n    'label': 'HTMLLabelElement',\n    'legend': 'HTMLLegendElement',\n    'li': 'HTMLLIElement',\n    'link': 'HTMLLinkElement',\n    'map': 'HTMLMapElement',\n    'marquee': 'HTMLMarqueeElement',\n    'menu': 'HTMLMenuElement',\n    'menuitem': 'HTMLMenuItemElement',\n    'meta': 'HTMLMetaElement',\n    'meter': 'HTMLMeterElement',\n    'object': 'HTMLObjectElement',\n    'ol': 'HTMLOListElement',\n    'optgroup': 'HTMLOptGroupElement',\n    'option': 'HTMLOptionElement',\n    'output': 'HTMLOutputElement',\n    'p': 'HTMLParagraphElement',\n    'param': 'HTMLParamElement',\n    'pre': 'HTMLPreElement',\n    'progress': 'HTMLProgressElement',\n    'q': 'HTMLQuoteElement',\n    'script': 'HTMLScriptElement',\n    'select': 'HTMLSelectElement',\n    'shadow': 'HTMLShadowElement',\n    'source': 'HTMLSourceElement',\n    'span': 'HTMLSpanElement',\n    'style': 'HTMLStyleElement',\n    'table': 'HTMLTableElement',\n    'tbody': 'HTMLTableSectionElement',\n    // WebKit and Moz are wrong:\n    // https://bugs.webkit.org/show_bug.cgi?id=111469\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=848096\n    // 'td': 'HTMLTableCellElement',\n    'template': 'HTMLTemplateElement',\n    'textarea': 'HTMLTextAreaElement',\n    'thead': 'HTMLTableSectionElement',\n    'time': 'HTMLTimeElement',\n    'title': 'HTMLTitleElement',\n    'tr': 'HTMLTableRowElement',\n    'track': 'HTMLTrackElement',\n    'ul': 'HTMLUListElement',\n    'video': 'HTMLVideoElement',\n  };\n\n  function overrideConstructor(tagName) {\n    var nativeConstructorName = elements[tagName];\n    var nativeConstructor = window[nativeConstructorName];\n    if (!nativeConstructor)\n      return;\n    var element = document.createElement(tagName);\n    var wrapperConstructor = element.constructor;\n    window[nativeConstructorName] = wrapperConstructor;\n  }\n\n  Object.keys(elements).forEach(overrideConstructor);\n\n  Object.getOwnPropertyNames(scope.wrappers).forEach(function(name) {\n    window[name] = scope.wrappers[name]\n  });\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function() {\n\n  // convenient global\n  window.wrap = ShadowDOMPolyfill.wrapIfNeeded;\n  window.unwrap = ShadowDOMPolyfill.unwrapIfNeeded;\n\n  // users may want to customize other types\n  // TODO(sjmiles): 'button' is now supported by ShadowDOMPolyfill, but\n  // I've left this code here in case we need to temporarily patch another\n  // type\n  /*\n  (function() {\n    var elts = {HTMLButtonElement: 'button'};\n    for (var c in elts) {\n      window[c] = function() { throw 'Patched Constructor'; };\n      window[c].prototype = Object.getPrototypeOf(\n          document.createElement(elts[c]));\n    }\n  })();\n  */\n\n  // patch in prefixed name\n  Object.defineProperty(Element.prototype, 'webkitShadowRoot',\n      Object.getOwnPropertyDescriptor(Element.prototype, 'shadowRoot'));\n\n  var originalCreateShadowRoot = Element.prototype.createShadowRoot;\n  Element.prototype.createShadowRoot = function() {\n    var root = originalCreateShadowRoot.call(this);\n    CustomElements.watchShadow(this);\n    return root;\n  };\n\n  Element.prototype.webkitCreateShadowRoot = Element.prototype.createShadowRoot;\n})();\n","/*\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/*\n  This is a limited shim for ShadowDOM css styling.\n  https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#styles\n  \n  The intention here is to support only the styling features which can be \n  relatively simply implemented. The goal is to allow users to avoid the \n  most obvious pitfalls and do so without compromising performance significantly. \n  For ShadowDOM styling that's not covered here, a set of best practices\n  can be provided that should allow users to accomplish more complex styling.\n\n  The following is a list of specific ShadowDOM styling features and a brief\n  discussion of the approach used to shim.\n\n  Shimmed features:\n\n  * :host, :host-context: ShadowDOM allows styling of the shadowRoot's host\n  element using the :host rule. To shim this feature, the :host styles are \n  reformatted and prefixed with a given scope name and promoted to a \n  document level stylesheet.\n  For example, given a scope name of .foo, a rule like this:\n  \n    :host {\n        background: red;\n      }\n    }\n  \n  becomes:\n  \n    .foo {\n      background: red;\n    }\n  \n  * encapsultion: Styles defined within ShadowDOM, apply only to \n  dom inside the ShadowDOM. Polymer uses one of two techniques to imlement\n  this feature.\n  \n  By default, rules are prefixed with the host element tag name \n  as a descendant selector. This ensures styling does not leak out of the 'top'\n  of the element's ShadowDOM. For example,\n\n  div {\n      font-weight: bold;\n    }\n  \n  becomes:\n\n  x-foo div {\n      font-weight: bold;\n    }\n  \n  becomes:\n\n\n  Alternatively, if Platform.ShadowCSS.strictStyling is set to true then \n  selectors are scoped by adding an attribute selector suffix to each\n  simple selector that contains the host element tag name. Each element \n  in the element's ShadowDOM template is also given the scope attribute. \n  Thus, these rules match only elements that have the scope attribute.\n  For example, given a scope name of x-foo, a rule like this:\n  \n    div {\n      font-weight: bold;\n    }\n  \n  becomes:\n  \n    div[x-foo] {\n      font-weight: bold;\n    }\n\n  Note that elements that are dynamically added to a scope must have the scope\n  selector added to them manually.\n\n  * upper/lower bound encapsulation: Styles which are defined outside a\n  shadowRoot should not cross the ShadowDOM boundary and should not apply\n  inside a shadowRoot.\n\n  This styling behavior is not emulated. Some possible ways to do this that \n  were rejected due to complexity and/or performance concerns include: (1) reset\n  every possible property for every possible selector for a given scope name;\n  (2) re-implement css in javascript.\n  \n  As an alternative, users should make sure to use selectors\n  specific to the scope in which they are working.\n  \n  * ::distributed: This behavior is not emulated. It's often not necessary\n  to style the contents of a specific insertion point and instead, descendants\n  of the host element can be styled selectively. Users can also create an \n  extra node around an insertion point and style that node's contents\n  via descendent selectors. For example, with a shadowRoot like this:\n  \n    <style>\n      ::content(div) {\n        background: red;\n      }\n    </style>\n    <content></content>\n  \n  could become:\n  \n    <style>\n      / *@polyfill .content-container div * / \n      ::content(div) {\n        background: red;\n      }\n    </style>\n    <div class=\"content-container\">\n      <content></content>\n    </div>\n  \n  Note the use of @polyfill in the comment above a ShadowDOM specific style\n  declaration. This is a directive to the styling shim to use the selector \n  in comments in lieu of the next selector when running under polyfill.\n*/\n(function(scope) {\n\nvar ShadowCSS = {\n  strictStyling: false,\n  registry: {},\n  // Shim styles for a given root associated with a name and extendsName\n  // 1. cache root styles by name\n  // 2. optionally tag root nodes with scope name\n  // 3. shim polyfill directives /* @polyfill */ and /* @polyfill-rule */\n  // 4. shim :host and scoping\n  shimStyling: function(root, name, extendsName) {\n    var scopeStyles = this.prepareRoot(root, name, extendsName);\n    var typeExtension = this.isTypeExtension(extendsName);\n    var scopeSelector = this.makeScopeSelector(name, typeExtension);\n    // use caching to make working with styles nodes easier and to facilitate\n    // lookup of extendee\n    var cssText = stylesToCssText(scopeStyles, true);\n    cssText = this.scopeCssText(cssText, scopeSelector);\n    // cache shimmed css on root for user extensibility\n    if (root) {\n      root.shimmedStyle = cssText;\n    }\n    // add style to document\n    this.addCssToDocument(cssText, name);\n  },\n  /*\n  * Shim a style element with the given selector. Returns cssText that can\n  * be included in the document via Platform.ShadowCSS.addCssToDocument(css).\n  */\n  shimStyle: function(style, selector) {\n    return this.shimCssText(style.textContent, selector);\n  },\n  /*\n  * Shim some cssText with the given selector. Returns cssText that can\n  * be included in the document via Platform.ShadowCSS.addCssToDocument(css).\n  */\n  shimCssText: function(cssText, selector) {\n    cssText = this.insertDirectives(cssText);\n    return this.scopeCssText(cssText, selector);\n  },\n  makeScopeSelector: function(name, typeExtension) {\n    if (name) {\n      return typeExtension ? '[is=' + name + ']' : name;\n    }\n    return '';\n  },\n  isTypeExtension: function(extendsName) {\n    return extendsName && extendsName.indexOf('-') < 0;\n  },\n  prepareRoot: function(root, name, extendsName) {\n    var def = this.registerRoot(root, name, extendsName);\n    this.replaceTextInStyles(def.rootStyles, this.insertDirectives);\n    // remove existing style elements\n    this.removeStyles(root, def.rootStyles);\n    // apply strict attr\n    if (this.strictStyling) {\n      this.applyScopeToContent(root, name);\n    }\n    return def.scopeStyles;\n  },\n  removeStyles: function(root, styles) {\n    for (var i=0, l=styles.length, s; (i<l) && (s=styles[i]); i++) {\n      s.parentNode.removeChild(s);\n    }\n  },\n  registerRoot: function(root, name, extendsName) {\n    var def = this.registry[name] = {\n      root: root,\n      name: name,\n      extendsName: extendsName\n    }\n    var styles = this.findStyles(root);\n    def.rootStyles = styles;\n    def.scopeStyles = def.rootStyles;\n    var extendee = this.registry[def.extendsName];\n    if (extendee) {\n      def.scopeStyles = extendee.scopeStyles.concat(def.scopeStyles);\n    }\n    return def;\n  },\n  findStyles: function(root) {\n    if (!root) {\n      return [];\n    }\n    var styles = root.querySelectorAll('style');\n    return Array.prototype.filter.call(styles, function(s) {\n      return !s.hasAttribute(NO_SHIM_ATTRIBUTE);\n    });\n  },\n  applyScopeToContent: function(root, name) {\n    if (root) {\n      // add the name attribute to each node in root.\n      Array.prototype.forEach.call(root.querySelectorAll('*'),\n          function(node) {\n            node.setAttribute(name, '');\n          });\n      // and template contents too\n      Array.prototype.forEach.call(root.querySelectorAll('template'),\n          function(template) {\n            this.applyScopeToContent(template.content, name);\n          },\n          this);\n    }\n  },\n  insertDirectives: function(cssText) {\n    cssText = this.insertPolyfillDirectivesInCssText(cssText);\n    return this.insertPolyfillRulesInCssText(cssText);\n  },\n  /*\n   * Process styles to convert native ShadowDOM rules that will trip\n   * up the css parser; we rely on decorating the stylesheet with inert rules.\n   * \n   * For example, we convert this rule:\n   * \n   * polyfill-next-selector { content: ':host menu-item'; }\n   * ::content menu-item {\n   * \n   * to this:\n   * \n   * scopeName menu-item {\n   *\n  **/\n  insertPolyfillDirectivesInCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    cssText = cssText.replace(cssCommentNextSelectorRe, function(match, p1) {\n      // remove end comment delimiter and add block start\n      return p1.slice(0, -2) + '{';\n    });\n    return cssText.replace(cssContentNextSelectorRe, function(match, p1) {\n      return p1 + ' {';\n    });\n  },\n  /*\n   * Process styles to add rules which will only apply under the polyfill\n   * \n   * For example, we convert this rule:\n   * \n   * polyfill-rule {\n   *   content: ':host menu-item';\n   * ...\n   * }\n   * \n   * to this:\n   * \n   * scopeName menu-item {...}\n   *\n  **/\n  insertPolyfillRulesInCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    cssText = cssText.replace(cssCommentRuleRe, function(match, p1) {\n      // remove end comment delimiter\n      return p1.slice(0, -1);\n    });\n    return cssText.replace(cssContentRuleRe, function(match, p1, p2, p3) {\n      var rule = match.replace(p1, '').replace(p2, '');\n      return p3 + rule;\n    });\n  },\n  /* Ensure styles are scoped. Pseudo-scoping takes a rule like:\n   * \n   *  .foo {... } \n   *  \n   *  and converts this to\n   *  \n   *  scopeName .foo { ... }\n  */\n  scopeCssText: function(cssText, scopeSelector) {\n    var unscoped = this.extractUnscopedRulesFromCssText(cssText);\n    cssText = this.insertPolyfillHostInCssText(cssText);\n    cssText = this.convertColonHost(cssText);\n    cssText = this.convertColonHostContext(cssText);\n    cssText = this.convertCombinators(cssText);\n    if (scopeSelector) {\n      var self = this, cssText;\n      withCssRules(cssText, function(rules) {\n        cssText = self.scopeRules(rules, scopeSelector);\n      });\n\n    }\n    cssText = cssText + '\\n' + unscoped;\n    return cssText.trim();\n  },\n  /*\n   * Process styles to add rules which will only apply under the polyfill\n   * and do not process via CSSOM. (CSSOM is destructive to rules on rare \n   * occasions, e.g. -webkit-calc on Safari.)\n   * For example, we convert this rule:\n   * \n   * (comment start) @polyfill-unscoped-rule menu-item { \n   * ... } (comment end)\n   * \n   * to this:\n   * \n   * menu-item {...}\n   *\n  **/\n  extractUnscopedRulesFromCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    var r = '', m;\n    while (m = cssCommentUnscopedRuleRe.exec(cssText)) {\n      r += m[1].slice(0, -1) + '\\n\\n';\n    }\n    while (m = cssContentUnscopedRuleRe.exec(cssText)) {\n      r += m[0].replace(m[2], '').replace(m[1], m[3]) + '\\n\\n';\n    }\n    return r;\n  },\n  /*\n   * convert a rule like :host(.foo) > .bar { }\n   *\n   * to\n   *\n   * scopeName.foo > .bar\n  */\n  convertColonHost: function(cssText) {\n    return this.convertColonRule(cssText, cssColonHostRe,\n        this.colonHostPartReplacer);\n  },\n  /*\n   * convert a rule like :host-context(.foo) > .bar { }\n   *\n   * to\n   *\n   * scopeName.foo > .bar, .foo scopeName > .bar { }\n   * \n   * and\n   *\n   * :host-context(.foo:host) .bar { ... }\n   * \n   * to\n   * \n   * scopeName.foo .bar { ... }\n  */\n  convertColonHostContext: function(cssText) {\n    return this.convertColonRule(cssText, cssColonHostContextRe,\n        this.colonHostContextPartReplacer);\n  },\n  convertColonRule: function(cssText, regExp, partReplacer) {\n    // p1 = :host, p2 = contents of (), p3 rest of rule\n    return cssText.replace(regExp, function(m, p1, p2, p3) {\n      p1 = polyfillHostNoCombinator;\n      if (p2) {\n        var parts = p2.split(','), r = [];\n        for (var i=0, l=parts.length, p; (i<l) && (p=parts[i]); i++) {\n          p = p.trim();\n          r.push(partReplacer(p1, p, p3));\n        }\n        return r.join(',');\n      } else {\n        return p1 + p3;\n      }\n    });\n  },\n  colonHostContextPartReplacer: function(host, part, suffix) {\n    if (part.match(polyfillHost)) {\n      return this.colonHostPartReplacer(host, part, suffix);\n    } else {\n      return host + part + suffix + ', ' + part + ' ' + host + suffix;\n    }\n  },\n  colonHostPartReplacer: function(host, part, suffix) {\n    return host + part.replace(polyfillHost, '') + suffix;\n  },\n  /*\n   * Convert ^ and ^^ combinators by replacing with space.\n  */\n  convertCombinators: function(cssText) {\n    for (var i=0; i < combinatorsRe.length; i++) {\n      cssText = cssText.replace(combinatorsRe[i], ' ');\n    }\n    return cssText;\n  },\n  // change a selector like 'div' to 'name div'\n  scopeRules: function(cssRules, scopeSelector) {\n    var cssText = '';\n    if (cssRules) {\n      Array.prototype.forEach.call(cssRules, function(rule) {\n        if (rule.selectorText && (rule.style && rule.style.cssText)) {\n          cssText += this.scopeSelector(rule.selectorText, scopeSelector, \n            this.strictStyling) + ' {\\n\\t';\n          cssText += this.propertiesFromRule(rule) + '\\n}\\n\\n';\n        } else if (rule.type === CSSRule.MEDIA_RULE) {\n          cssText += '@media ' + rule.media.mediaText + ' {\\n';\n          cssText += this.scopeRules(rule.cssRules, scopeSelector);\n          cssText += '\\n}\\n\\n';\n        } else if (rule.cssText) {\n          cssText += rule.cssText + '\\n\\n';\n        }\n      }, this);\n    }\n    return cssText;\n  },\n  scopeSelector: function(selector, scopeSelector, strict) {\n    var r = [], parts = selector.split(',');\n    parts.forEach(function(p) {\n      p = p.trim();\n      if (this.selectorNeedsScoping(p, scopeSelector)) {\n        p = (strict && !p.match(polyfillHostNoCombinator)) ? \n            this.applyStrictSelectorScope(p, scopeSelector) :\n            this.applySelectorScope(p, scopeSelector);\n      }\n      r.push(p);\n    }, this);\n    return r.join(', ');\n  },\n  selectorNeedsScoping: function(selector, scopeSelector) {\n    if (Array.isArray(scopeSelector)) {\n      return true;\n    }\n    var re = this.makeScopeMatcher(scopeSelector);\n    return !selector.match(re);\n  },\n  makeScopeMatcher: function(scopeSelector) {\n    scopeSelector = scopeSelector.replace(/\\[/g, '\\\\[').replace(/\\[/g, '\\\\]');\n    return new RegExp('^(' + scopeSelector + ')' + selectorReSuffix, 'm');\n  },\n  applySelectorScope: function(selector, selectorScope) {\n    return Array.isArray(selectorScope) ?\n        this.applySelectorScopeList(selector, selectorScope) :\n        this.applySimpleSelectorScope(selector, selectorScope);\n  },\n  // apply an array of selectors\n  applySelectorScopeList: function(selector, scopeSelectorList) {\n    var r = [];\n    for (var i=0, s; (s=scopeSelectorList[i]); i++) {\n      r.push(this.applySimpleSelectorScope(selector, s));\n    }\n    return r.join(', ');\n  },\n  // scope via name and [is=name]\n  applySimpleSelectorScope: function(selector, scopeSelector) {\n    if (selector.match(polyfillHostRe)) {\n      selector = selector.replace(polyfillHostNoCombinator, scopeSelector);\n      return selector.replace(polyfillHostRe, scopeSelector + ' ');\n    } else {\n      return scopeSelector + ' ' + selector;\n    }\n  },\n  // return a selector with [name] suffix on each simple selector\n  // e.g. .foo.bar > .zot becomes .foo[name].bar[name] > .zot[name]\n  applyStrictSelectorScope: function(selector, scopeSelector) {\n    scopeSelector = scopeSelector.replace(/\\[is=([^\\]]*)\\]/g, '$1');\n    var splits = [' ', '>', '+', '~'],\n      scoped = selector,\n      attrName = '[' + scopeSelector + ']';\n    splits.forEach(function(sep) {\n      var parts = scoped.split(sep);\n      scoped = parts.map(function(p) {\n        // remove :host since it should be unnecessary\n        var t = p.trim().replace(polyfillHostRe, '');\n        if (t && (splits.indexOf(t) < 0) && (t.indexOf(attrName) < 0)) {\n          p = t.replace(/([^:]*)(:*)(.*)/, '$1' + attrName + '$2$3')\n        }\n        return p;\n      }).join(sep);\n    });\n    return scoped;\n  },\n  insertPolyfillHostInCssText: function(selector) {\n    return selector.replace(colonHostContextRe, polyfillHostContext).replace(\n        colonHostRe, polyfillHost);\n  },\n  propertiesFromRule: function(rule) {\n    var cssText = rule.style.cssText;\n    // TODO(sorvell): Safari cssom incorrectly removes quotes from the content\n    // property. (https://bugs.webkit.org/show_bug.cgi?id=118045)\n    // don't replace attr rules\n    if (rule.style.content && !rule.style.content.match(/['\"]+|attr/)) {\n      cssText = cssText.replace(/content:[^;]*;/g, 'content: \\'' + \n          rule.style.content + '\\';');\n    }\n    // TODO(sorvell): we can workaround this issue here, but we need a list\n    // of troublesome properties to fix https://github.com/Polymer/platform/issues/53\n    //\n    // inherit rules can be omitted from cssText\n    // TODO(sorvell): remove when Blink bug is fixed:\n    // https://code.google.com/p/chromium/issues/detail?id=358273\n    var style = rule.style;\n    for (var i in style) {\n      if (style[i] === 'initial') {\n        cssText += i + ': initial; ';\n      }\n    }\n    return cssText;\n  },\n  replaceTextInStyles: function(styles, action) {\n    if (styles && action) {\n      if (!(styles instanceof Array)) {\n        styles = [styles];\n      }\n      Array.prototype.forEach.call(styles, function(s) {\n        s.textContent = action.call(this, s.textContent);\n      }, this);\n    }\n  },\n  addCssToDocument: function(cssText, name) {\n    if (cssText.match('@import')) {\n      addOwnSheet(cssText, name);\n    } else {\n      addCssToDocument(cssText);\n    }\n  }\n};\n\nvar selectorRe = /([^{]*)({[\\s\\S]*?})/gim,\n    cssCommentRe = /\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\//gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentNextSelectorRe = /\\/\\*\\s*@polyfill ([^*]*\\*+([^/*][^*]*\\*+)*\\/)([^{]*?){/gim,\n    cssContentNextSelectorRe = /polyfill-next-selector[^}]*content\\:[\\s]*'([^']*)'[^}]*}([^{]*?){/gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentRuleRe = /\\/\\*\\s@polyfill-rule([^*]*\\*+([^/*][^*]*\\*+)*)\\//gim,\n    cssContentRuleRe = /(polyfill-rule)[^}]*(content\\:[\\s]*'([^']*)'[^;]*;)[^}]*}/gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentUnscopedRuleRe = /\\/\\*\\s@polyfill-unscoped-rule([^*]*\\*+([^/*][^*]*\\*+)*)\\//gim,\n    cssContentUnscopedRuleRe = /(polyfill-unscoped-rule)[^}]*(content\\:[\\s]*'([^']*)'[^;]*;)[^}]*}/gim,\n    cssPseudoRe = /::(x-[^\\s{,(]*)/gim,\n    cssPartRe = /::part\\(([^)]*)\\)/gim,\n    // note: :host pre-processed to -shadowcsshost.\n    polyfillHost = '-shadowcsshost',\n    // note: :host-context pre-processed to -shadowcsshostcontext.\n    polyfillHostContext = '-shadowcsscontext',\n    parenSuffix = ')(?:\\\\((' +\n        '(?:\\\\([^)(]*\\\\)|[^)(]*)+?' +\n        ')\\\\))?([^,{]*)';\n    cssColonHostRe = new RegExp('(' + polyfillHost + parenSuffix, 'gim'),\n    cssColonHostContextRe = new RegExp('(' + polyfillHostContext + parenSuffix, 'gim'),\n    selectorReSuffix = '([>\\\\s~+\\[.,{:][\\\\s\\\\S]*)?$',\n    colonHostRe = /\\:host/gim,\n    colonHostContextRe = /\\:host-context/gim,\n    /* host name without combinator */\n    polyfillHostNoCombinator = polyfillHost + '-no-combinator',\n    polyfillHostRe = new RegExp(polyfillHost, 'gim'),\n    polyfillHostContextRe = new RegExp(polyfillHostContext, 'gim'),\n    combinatorsRe = [\n      /\\^\\^/g,\n      /\\^/g,\n      /\\/shadow\\//g,\n      /\\/shadow-deep\\//g,\n      /::shadow/g,\n      /\\/deep\\//g\n    ];\n\nfunction stylesToCssText(styles, preserveComments) {\n  var cssText = '';\n  Array.prototype.forEach.call(styles, function(s) {\n    cssText += s.textContent + '\\n\\n';\n  });\n  // strip comments for easier processing\n  if (!preserveComments) {\n    cssText = cssText.replace(cssCommentRe, '');\n  }\n  return cssText;\n}\n\nfunction cssTextToStyle(cssText) {\n  var style = document.createElement('style');\n  style.textContent = cssText;\n  return style;\n}\n\nfunction cssToRules(cssText) {\n  var style = cssTextToStyle(cssText);\n  document.head.appendChild(style);\n  var rules = [];\n  if (style.sheet) {\n    // TODO(sorvell): Firefox throws when accessing the rules of a stylesheet\n    // with an @import\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=625013\n    try {\n      rules = style.sheet.cssRules;\n    } catch(e) {\n      //\n    }\n  } else {\n    console.warn('sheet not found', style);\n  }\n  style.parentNode.removeChild(style);\n  return rules;\n}\n\nvar frame = document.createElement('iframe');\nframe.style.display = 'none';\n\nfunction initFrame() {\n  frame.initialized = true;\n  document.body.appendChild(frame);\n  var doc = frame.contentDocument;\n  var base = doc.createElement('base');\n  base.href = document.baseURI;\n  doc.head.appendChild(base);\n}\n\nfunction inFrame(fn) {\n  if (!frame.initialized) {\n    initFrame();\n  }\n  document.body.appendChild(frame);\n  fn(frame.contentDocument);\n  document.body.removeChild(frame);\n}\n\n// TODO(sorvell): use an iframe if the cssText contains an @import to workaround\n// https://code.google.com/p/chromium/issues/detail?id=345114\nvar isChrome = navigator.userAgent.match('Chrome');\nfunction withCssRules(cssText, callback) {\n  if (!callback) {\n    return;\n  }\n  var rules;\n  if (cssText.match('@import') && isChrome) {\n    var style = cssTextToStyle(cssText);\n    inFrame(function(doc) {\n      doc.head.appendChild(style.impl);\n      rules = style.sheet.cssRules;\n      callback(rules);\n    });\n  } else {\n    rules = cssToRules(cssText);\n    callback(rules);\n  }\n}\n\nfunction rulesToCss(cssRules) {\n  for (var i=0, css=[]; i < cssRules.length; i++) {\n    css.push(cssRules[i].cssText);\n  }\n  return css.join('\\n\\n');\n}\n\nfunction addCssToDocument(cssText) {\n  if (cssText) {\n    getSheet().appendChild(document.createTextNode(cssText));\n  }\n}\n\nfunction addOwnSheet(cssText, name) {\n  var style = cssTextToStyle(cssText);\n  style.setAttribute(name, '');\n  style.setAttribute(SHIMMED_ATTRIBUTE, '');\n  document.head.appendChild(style);\n}\n\nvar SHIM_ATTRIBUTE = 'shim-shadowdom';\nvar SHIMMED_ATTRIBUTE = 'shim-shadowdom-css';\nvar NO_SHIM_ATTRIBUTE = 'no-shim';\n\nvar sheet;\nfunction getSheet() {\n  if (!sheet) {\n    sheet = document.createElement(\"style\");\n    sheet.setAttribute(SHIMMED_ATTRIBUTE, '');\n    sheet[SHIMMED_ATTRIBUTE] = true;\n  }\n  return sheet;\n}\n\n// add polyfill stylesheet to document\nif (window.ShadowDOMPolyfill) {\n  addCssToDocument('style { display: none !important; }\\n');\n  var doc = wrap(document);\n  var head = doc.querySelector('head');\n  head.insertBefore(getSheet(), head.childNodes[0]);\n\n  // TODO(sorvell): monkey-patching HTMLImports is abusive;\n  // consider a better solution.\n  document.addEventListener('DOMContentLoaded', function() {\n    var urlResolver = scope.urlResolver;\n    \n    if (window.HTMLImports && !HTMLImports.useNative) {\n      var SHIM_SHEET_SELECTOR = 'link[rel=stylesheet]' +\n          '[' + SHIM_ATTRIBUTE + ']';\n      var SHIM_STYLE_SELECTOR = 'style[' + SHIM_ATTRIBUTE + ']';\n      HTMLImports.importer.documentPreloadSelectors += ',' + SHIM_SHEET_SELECTOR;\n      HTMLImports.importer.importsPreloadSelectors += ',' + SHIM_SHEET_SELECTOR;\n\n      HTMLImports.parser.documentSelectors = [\n        HTMLImports.parser.documentSelectors,\n        SHIM_SHEET_SELECTOR,\n        SHIM_STYLE_SELECTOR\n      ].join(',');\n  \n      var originalParseGeneric = HTMLImports.parser.parseGeneric;\n\n      HTMLImports.parser.parseGeneric = function(elt) {\n        if (elt[SHIMMED_ATTRIBUTE]) {\n          return;\n        }\n        var style = elt.__importElement || elt;\n        if (!style.hasAttribute(SHIM_ATTRIBUTE)) {\n          originalParseGeneric.call(this, elt);\n          return;\n        }\n        if (elt.__resource) {\n          style = elt.ownerDocument.createElement('style');\n          style.textContent = urlResolver.resolveCssText(\n              elt.__resource, elt.href);\n        } else {\n          urlResolver.resolveStyle(style);  \n        }\n        style.textContent = ShadowCSS.shimStyle(style);\n        style.removeAttribute(SHIM_ATTRIBUTE, '');\n        style.setAttribute(SHIMMED_ATTRIBUTE, '');\n        style[SHIMMED_ATTRIBUTE] = true;\n        // place in document\n        if (style.parentNode !== head) {\n          // replace links in head\n          if (elt.parentNode === head) {\n            head.replaceChild(style, elt);\n          } else {\n            head.appendChild(style);\n          }\n        }\n        style.__importParsed = true;\n        this.markParsingComplete(elt);\n      }\n\n      var hasResource = HTMLImports.parser.hasResource;\n      HTMLImports.parser.hasResource = function(node) {\n        if (node.localName === 'link' && node.rel === 'stylesheet' &&\n            node.hasAttribute(SHIM_ATTRIBUTE)) {\n          return (node.__resource);\n        } else {\n          return hasResource.call(this, node);\n        }\n      }\n\n    }\n  });\n}\n\n// exports\nscope.ShadowCSS = ShadowCSS;\n\n})(window.Platform);","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function() {\n\n  // poor man's adapter for template.content on various platform scenarios\n  window.templateContent = window.templateContent || function(inTemplate) {\n    return inTemplate.content;\n  };\n\n  // so we can call wrap/unwrap without testing for ShadowDOMPolyfill\n\n  window.wrap = window.unwrap = function(n){\n    return n;\n  }\n  \n  addEventListener('DOMContentLoaded', function() {\n    if (CustomElements.useNative === false) {\n      var originalCreateShadowRoot = Element.prototype.createShadowRoot;\n      Element.prototype.createShadowRoot = function() {\n        var root = originalCreateShadowRoot.call(this);\n        CustomElements.watchShadow(this);\n        return root;\n      };\n    }\n  });\n  \n  window.templateContent = function(inTemplate) {\n    // if MDV exists, it may need to boostrap this template to reveal content\n    if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) {\n      HTMLTemplateElement.bootstrap(inTemplate);\n    }\n    // fallback when there is no Shadow DOM polyfill, no MDV polyfill, and no\n    // native template support\n    if (!inTemplate.content && !inTemplate._content) {\n      var frag = document.createDocumentFragment();\n      while (inTemplate.firstChild) {\n        frag.appendChild(inTemplate.firstChild);\n      }\n      inTemplate._content = frag;\n    }\n    return inTemplate.content || inTemplate._content;\n  };\n\n})();","/* Any copyright is dedicated to the Public Domain.\n * http://creativecommons.org/publicdomain/zero/1.0/ */\n\n(function(scope) {\n  'use strict';\n\n  // feature detect for URL constructor\n  var hasWorkingUrl = false;\n  if (!scope.forceJURL) {\n    try {\n      var u = new URL('b', 'http://a');\n      hasWorkingUrl = u.href === 'http://a/b';\n    } catch(e) {}\n  }\n\n  if (hasWorkingUrl)\n    return;\n\n  var relative = Object.create(null);\n  relative['ftp'] = 21;\n  relative['file'] = 0;\n  relative['gopher'] = 70;\n  relative['http'] = 80;\n  relative['https'] = 443;\n  relative['ws'] = 80;\n  relative['wss'] = 443;\n\n  var relativePathDotMapping = Object.create(null);\n  relativePathDotMapping['%2e'] = '.';\n  relativePathDotMapping['.%2e'] = '..';\n  relativePathDotMapping['%2e.'] = '..';\n  relativePathDotMapping['%2e%2e'] = '..';\n\n  function isRelativeScheme(scheme) {\n    return relative[scheme] !== undefined;\n  }\n\n  function invalid() {\n    clear.call(this);\n    this._isInvalid = true;\n  }\n\n  function IDNAToASCII(h) {\n    if ('' == h) {\n      invalid.call(this)\n    }\n    // XXX\n    return h.toLowerCase()\n  }\n\n  function percentEscape(c) {\n    var unicode = c.charCodeAt(0);\n    if (unicode > 0x20 &&\n       unicode < 0x7F &&\n       // \" # < > ? `\n       [0x22, 0x23, 0x3C, 0x3E, 0x3F, 0x60].indexOf(unicode) == -1\n      ) {\n      return c;\n    }\n    return encodeURIComponent(c);\n  }\n\n  function percentEscapeQuery(c) {\n    // XXX This actually needs to encode c using encoding and then\n    // convert the bytes one-by-one.\n\n    var unicode = c.charCodeAt(0);\n    if (unicode > 0x20 &&\n       unicode < 0x7F &&\n       // \" # < > ` (do not escape '?')\n       [0x22, 0x23, 0x3C, 0x3E, 0x60].indexOf(unicode) == -1\n      ) {\n      return c;\n    }\n    return encodeURIComponent(c);\n  }\n\n  var EOF = undefined,\n      ALPHA = /[a-zA-Z]/,\n      ALPHANUMERIC = /[a-zA-Z0-9\\+\\-\\.]/;\n\n  function parse(input, stateOverride, base) {\n    function err(message) {\n      errors.push(message)\n    }\n\n    var state = stateOverride || 'scheme start',\n        cursor = 0,\n        buffer = '',\n        seenAt = false,\n        seenBracket = false,\n        errors = [];\n\n    loop: while ((input[cursor - 1] != EOF || cursor == 0) && !this._isInvalid) {\n      var c = input[cursor];\n      switch (state) {\n        case 'scheme start':\n          if (c && ALPHA.test(c)) {\n            buffer += c.toLowerCase(); // ASCII-safe\n            state = 'scheme';\n          } else if (!stateOverride) {\n            buffer = '';\n            state = 'no scheme';\n            continue;\n          } else {\n            err('Invalid scheme.');\n            break loop;\n          }\n          break;\n\n        case 'scheme':\n          if (c && ALPHANUMERIC.test(c)) {\n            buffer += c.toLowerCase(); // ASCII-safe\n          } else if (':' == c) {\n            this._scheme = buffer;\n            buffer = '';\n            if (stateOverride) {\n              break loop;\n            }\n            if (isRelativeScheme(this._scheme)) {\n              this._isRelative = true;\n            }\n            if ('file' == this._scheme) {\n              state = 'relative';\n            } else if (this._isRelative && base && base._scheme == this._scheme) {\n              state = 'relative or authority';\n            } else if (this._isRelative) {\n              state = 'authority first slash';\n            } else {\n              state = 'scheme data';\n            }\n          } else if (!stateOverride) {\n            buffer = '';\n            cursor = 0;\n            state = 'no scheme';\n            continue;\n          } else if (EOF == c) {\n            break loop;\n          } else {\n            err('Code point not allowed in scheme: ' + c)\n            break loop;\n          }\n          break;\n\n        case 'scheme data':\n          if ('?' == c) {\n            query = '?';\n            state = 'query';\n          } else if ('#' == c) {\n            this._fragment = '#';\n            state = 'fragment';\n          } else {\n            // XXX error handling\n            if (EOF != c && '\\t' != c && '\\n' != c && '\\r' != c) {\n              this._schemeData += percentEscape(c);\n            }\n          }\n          break;\n\n        case 'no scheme':\n          if (!base || !(isRelativeScheme(base._scheme))) {\n            err('Missing scheme.');\n            invalid.call(this);\n          } else {\n            state = 'relative';\n            continue;\n          }\n          break;\n\n        case 'relative or authority':\n          if ('/' == c && '/' == input[cursor+1]) {\n            state = 'authority ignore slashes';\n          } else {\n            err('Expected /, got: ' + c);\n            state = 'relative';\n            continue\n          }\n          break;\n\n        case 'relative':\n          this._isRelative = true;\n          if ('file' != this._scheme)\n            this._scheme = base._scheme;\n          if (EOF == c) {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = base._query;\n            break loop;\n          } else if ('/' == c || '\\\\' == c) {\n            if ('\\\\' == c)\n              err('\\\\ is an invalid code point.');\n            state = 'relative slash';\n          } else if ('?' == c) {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = '?';\n            state = 'query';\n          } else if ('#' == c) {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = base._query;\n            this._fragment = '#';\n            state = 'fragment';\n          } else {\n            var nextC = input[cursor+1]\n            var nextNextC = input[cursor+2]\n            if (\n              'file' != this._scheme || !ALPHA.test(c) ||\n              (nextC != ':' && nextC != '|') ||\n              (EOF != nextNextC && '/' != nextNextC && '\\\\' != nextNextC && '?' != nextNextC && '#' != nextNextC)) {\n              this._host = base._host;\n              this._port = base._port;\n              this._path = base._path.slice();\n              this._path.pop();\n            }\n            state = 'relative path';\n            continue;\n          }\n          break;\n\n        case 'relative slash':\n          if ('/' == c || '\\\\' == c) {\n            if ('\\\\' == c) {\n              err('\\\\ is an invalid code point.');\n            }\n            if ('file' == this._scheme) {\n              state = 'file host';\n            } else {\n              state = 'authority ignore slashes';\n            }\n          } else {\n            if ('file' != this._scheme) {\n              this._host = base._host;\n              this._port = base._port;\n            }\n            state = 'relative path';\n            continue;\n          }\n          break;\n\n        case 'authority first slash':\n          if ('/' == c) {\n            state = 'authority second slash';\n          } else {\n            err(\"Expected '/', got: \" + c);\n            state = 'authority ignore slashes';\n            continue;\n          }\n          break;\n\n        case 'authority second slash':\n          state = 'authority ignore slashes';\n          if ('/' != c) {\n            err(\"Expected '/', got: \" + c);\n            continue;\n          }\n          break;\n\n        case 'authority ignore slashes':\n          if ('/' != c && '\\\\' != c) {\n            state = 'authority';\n            continue;\n          } else {\n            err('Expected authority, got: ' + c);\n          }\n          break;\n\n        case 'authority':\n          if ('@' == c) {\n            if (seenAt) {\n              err('@ already seen.');\n              buffer += '%40';\n            }\n            seenAt = true;\n            for (var i = 0; i < buffer.length; i++) {\n              var cp = buffer[i];\n              if ('\\t' == cp || '\\n' == cp || '\\r' == cp) {\n                err('Invalid whitespace in authority.');\n                continue;\n              }\n              // XXX check URL code points\n              if (':' == cp && null === this._password) {\n                this._password = '';\n                continue;\n              }\n              var tempC = percentEscape(cp);\n              (null !== this._password) ? this._password += tempC : this._username += tempC;\n            }\n            buffer = '';\n          } else if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c) {\n            cursor -= buffer.length;\n            buffer = '';\n            state = 'host';\n            continue;\n          } else {\n            buffer += c;\n          }\n          break;\n\n        case 'file host':\n          if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c) {\n            if (buffer.length == 2 && ALPHA.test(buffer[0]) && (buffer[1] == ':' || buffer[1] == '|')) {\n              state = 'relative path';\n            } else if (buffer.length == 0) {\n              state = 'relative path start';\n            } else {\n              this._host = IDNAToASCII.call(this, buffer);\n              buffer = '';\n              state = 'relative path start';\n            }\n            continue;\n          } else if ('\\t' == c || '\\n' == c || '\\r' == c) {\n            err('Invalid whitespace in file host.');\n          } else {\n            buffer += c;\n          }\n          break;\n\n        case 'host':\n        case 'hostname':\n          if (':' == c && !seenBracket) {\n            // XXX host parsing\n            this._host = IDNAToASCII.call(this, buffer);\n            buffer = '';\n            state = 'port';\n            if ('hostname' == stateOverride) {\n              break loop;\n            }\n          } else if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c) {\n            this._host = IDNAToASCII.call(this, buffer);\n            buffer = '';\n            state = 'relative path start';\n            if (stateOverride) {\n              break loop;\n            }\n            continue;\n          } else if ('\\t' != c && '\\n' != c && '\\r' != c) {\n            if ('[' == c) {\n              seenBracket = true;\n            } else if (']' == c) {\n              seenBracket = false;\n            }\n            buffer += c;\n          } else {\n            err('Invalid code point in host/hostname: ' + c);\n          }\n          break;\n\n        case 'port':\n          if (/[0-9]/.test(c)) {\n            buffer += c;\n          } else if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c || stateOverride) {\n            if ('' != buffer) {\n              var temp = parseInt(buffer, 10);\n              if (temp != relative[this._scheme]) {\n                this._port = temp + '';\n              }\n              buffer = '';\n            }\n            if (stateOverride) {\n              break loop;\n            }\n            state = 'relative path start';\n            continue;\n          } else if ('\\t' == c || '\\n' == c || '\\r' == c) {\n            err('Invalid code point in port: ' + c);\n          } else {\n            invalid.call(this);\n          }\n          break;\n\n        case 'relative path start':\n          if ('\\\\' == c)\n            err(\"'\\\\' not allowed in path.\");\n          state = 'relative path';\n          if ('/' != c && '\\\\' != c) {\n            continue;\n          }\n          break;\n\n        case 'relative path':\n          if (EOF == c || '/' == c || '\\\\' == c || (!stateOverride && ('?' == c || '#' == c))) {\n            if ('\\\\' == c) {\n              err('\\\\ not allowed in relative path.');\n            }\n            var tmp;\n            if (tmp = relativePathDotMapping[buffer.toLowerCase()]) {\n              buffer = tmp;\n            }\n            if ('..' == buffer) {\n              this._path.pop();\n              if ('/' != c && '\\\\' != c) {\n                this._path.push('');\n              }\n            } else if ('.' == buffer && '/' != c && '\\\\' != c) {\n              this._path.push('');\n            } else if ('.' != buffer) {\n              if ('file' == this._scheme && this._path.length == 0 && buffer.length == 2 && ALPHA.test(buffer[0]) && buffer[1] == '|') {\n                buffer = buffer[0] + ':';\n              }\n              this._path.push(buffer);\n            }\n            buffer = '';\n            if ('?' == c) {\n              this._query = '?';\n              state = 'query';\n            } else if ('#' == c) {\n              this._fragment = '#';\n              state = 'fragment';\n            }\n          } else if ('\\t' != c && '\\n' != c && '\\r' != c) {\n            buffer += percentEscape(c);\n          }\n          break;\n\n        case 'query':\n          if (!stateOverride && '#' == c) {\n            this._fragment = '#';\n            state = 'fragment';\n          } else if (EOF != c && '\\t' != c && '\\n' != c && '\\r' != c) {\n            this._query += percentEscapeQuery(c);\n          }\n          break;\n\n        case 'fragment':\n          if (EOF != c && '\\t' != c && '\\n' != c && '\\r' != c) {\n            this._fragment += c;\n          }\n          break;\n      }\n\n      cursor++;\n    }\n  }\n\n  function clear() {\n    this._scheme = '';\n    this._schemeData = '';\n    this._username = '';\n    this._password = null;\n    this._host = '';\n    this._port = '';\n    this._path = [];\n    this._query = '';\n    this._fragment = '';\n    this._isInvalid = false;\n    this._isRelative = false;\n  }\n\n  // Does not process domain names or IP addresses.\n  // Does not handle encoding for the query parameter.\n  function jURL(url, base /* , encoding */) {\n    if (base !== undefined && !(base instanceof jURL))\n      base = new jURL(String(base));\n\n    this._url = url;\n    clear.call(this);\n\n    var input = url.replace(/^[ \\t\\r\\n\\f]+|[ \\t\\r\\n\\f]+$/g, '');\n    // encoding = encoding || 'utf-8'\n\n    parse.call(this, input, null, base);\n  }\n\n  jURL.prototype = {\n    get href() {\n      if (this._isInvalid)\n        return this._url;\n\n      var authority = '';\n      if ('' != this._username || null != this._password) {\n        authority = this._username +\n            (null != this._password ? ':' + this._password : '') + '@';\n      }\n\n      return this.protocol +\n          (this._isRelative ? '//' + authority + this.host : '') +\n          this.pathname + this._query + this._fragment;\n    },\n    set href(href) {\n      clear.call(this);\n      parse.call(this, href);\n    },\n\n    get protocol() {\n      return this._scheme + ':';\n    },\n    set protocol(protocol) {\n      if (this._isInvalid)\n        return;\n      parse.call(this, protocol + ':', 'scheme start');\n    },\n\n    get host() {\n      return this._isInvalid ? '' : this._port ?\n          this._host + ':' + this._port : this._host;\n    },\n    set host(host) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      parse.call(this, host, 'host');\n    },\n\n    get hostname() {\n      return this._host;\n    },\n    set hostname(hostname) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      parse.call(this, hostname, 'hostname');\n    },\n\n    get port() {\n      return this._port;\n    },\n    set port(port) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      parse.call(this, port, 'port');\n    },\n\n    get pathname() {\n      return this._isInvalid ? '' : this._isRelative ?\n          '/' + this._path.join('/') : this._schemeData;\n    },\n    set pathname(pathname) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      this._path = [];\n      parse.call(this, pathname, 'relative path start');\n    },\n\n    get search() {\n      return this._isInvalid || !this._query || '?' == this._query ?\n          '' : this._query;\n    },\n    set search(search) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      this._query = '?';\n      if ('?' == search[0])\n        search = search.slice(1);\n      parse.call(this, search, 'query');\n    },\n\n    get hash() {\n      return this._isInvalid || !this._fragment || '#' == this._fragment ?\n          '' : this._fragment;\n    },\n    set hash(hash) {\n      if (this._isInvalid)\n        return;\n      this._fragment = '#';\n      if ('#' == hash[0])\n        hash = hash.slice(1);\n      parse.call(this, hash, 'fragment');\n    }\n  };\n\n  scope.URL = jURL;\n\n})(window);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\n// Old versions of iOS do not have bind.\n\nif (!Function.prototype.bind) {\n  Function.prototype.bind = function(scope) {\n    var self = this;\n    var args = Array.prototype.slice.call(arguments, 1);\n    return function() {\n      var args2 = args.slice();\n      args2.push.apply(args2, arguments);\n      return self.apply(scope, args2);\n    };\n  };\n}\n\n// mixin\n\n// copy all properties from inProps (et al) to inObj\nfunction mixin(inObj/*, inProps, inMoreProps, ...*/) {\n  var obj = inObj || {};\n  for (var i = 1; i < arguments.length; i++) {\n    var p = arguments[i];\n    try {\n      for (var n in p) {\n        copyProperty(n, p, obj);\n      }\n    } catch(x) {\n    }\n  }\n  return obj;\n}\n\n// copy property inName from inSource object to inTarget object\nfunction copyProperty(inName, inSource, inTarget) {\n  var pd = getPropertyDescriptor(inSource, inName);\n  Object.defineProperty(inTarget, inName, pd);\n}\n\n// get property descriptor for inName on inObject, even if\n// inName exists on some link in inObject's prototype chain\nfunction getPropertyDescriptor(inObject, inName) {\n  if (inObject) {\n    var pd = Object.getOwnPropertyDescriptor(inObject, inName);\n    return pd || getPropertyDescriptor(Object.getPrototypeOf(inObject), inName);\n  }\n}\n\n// export\n\nscope.mixin = mixin;\n\n})(window.Platform);","// Copyright 2011 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n(function(scope) {\n\n  'use strict';\n\n  // polyfill DOMTokenList\n  // * add/remove: allow these methods to take multiple classNames\n  // * toggle: add a 2nd argument which forces the given state rather\n  //  than toggling.\n\n  var add = DOMTokenList.prototype.add;\n  var remove = DOMTokenList.prototype.remove;\n  DOMTokenList.prototype.add = function() {\n    for (var i = 0; i < arguments.length; i++) {\n      add.call(this, arguments[i]);\n    }\n  };\n  DOMTokenList.prototype.remove = function() {\n    for (var i = 0; i < arguments.length; i++) {\n      remove.call(this, arguments[i]);\n    }\n  };\n  DOMTokenList.prototype.toggle = function(name, bool) {\n    if (arguments.length == 1) {\n      bool = !this.contains(name);\n    }\n    bool ? this.add(name) : this.remove(name);\n  };\n  DOMTokenList.prototype.switch = function(oldName, newName) {\n    oldName && this.remove(oldName);\n    newName && this.add(newName);\n  };\n\n  // add array() to NodeList, NamedNodeMap, HTMLCollection\n\n  var ArraySlice = function() {\n    return Array.prototype.slice.call(this);\n  };\n\n  var namedNodeMap = (window.NamedNodeMap || window.MozNamedAttrMap || {});\n\n  NodeList.prototype.array = ArraySlice;\n  namedNodeMap.prototype.array = ArraySlice;\n  HTMLCollection.prototype.array = ArraySlice;\n\n  // polyfill performance.now\n\n  if (!window.performance) {\n    var start = Date.now();\n    // only at millisecond precision\n    window.performance = {now: function(){ return Date.now() - start }};\n  }\n\n  // polyfill for requestAnimationFrame\n\n  if (!window.requestAnimationFrame) {\n    window.requestAnimationFrame = (function() {\n      var nativeRaf = window.webkitRequestAnimationFrame ||\n        window.mozRequestAnimationFrame;\n\n      return nativeRaf ?\n        function(callback) {\n          return nativeRaf(function() {\n            callback(performance.now());\n          });\n        } :\n        function( callback ){\n          return window.setTimeout(callback, 1000 / 60);\n        };\n    })();\n  }\n\n  if (!window.cancelAnimationFrame) {\n    window.cancelAnimationFrame = (function() {\n      return  window.webkitCancelAnimationFrame ||\n        window.mozCancelAnimationFrame ||\n        function(id) {\n          clearTimeout(id);\n        };\n    })();\n  }\n\n  // utility\n\n  function createDOM(inTagOrNode, inHTML, inAttrs) {\n    var dom = typeof inTagOrNode == 'string' ?\n        document.createElement(inTagOrNode) : inTagOrNode.cloneNode(true);\n    dom.innerHTML = inHTML;\n    if (inAttrs) {\n      for (var n in inAttrs) {\n        dom.setAttribute(n, inAttrs[n]);\n      }\n    }\n    return dom;\n  }\n  // Make a stub for Polymer() for polyfill purposes; under the HTMLImports\n  // polyfill, scripts in the main document run before imports. That means\n  // if (1) polymer is imported and (2) Polymer() is called in the main document\n  // in a script after the import, 2 occurs before 1. We correct this here\n  // by specfiically patching Polymer(); this is not necessary under native\n  // HTMLImports.\n  var elementDeclarations = [];\n\n  var polymerStub = function(name, dictionary) {\n    elementDeclarations.push(arguments);\n  }\n  window.Polymer = polymerStub;\n\n  // deliver queued delcarations\n  scope.deliverDeclarations = function() {\n    scope.deliverDeclarations = function() {\n     throw 'Possible attempt to load Polymer twice';\n    };\n    return elementDeclarations;\n  }\n\n  // Once DOMContent has loaded, any main document scripts that depend on\n  // Polymer() should have run. Calling Polymer() now is an error until\n  // polymer is imported.\n  window.addEventListener('DOMContentLoaded', function() {\n    if (window.Polymer === polymerStub) {\n      window.Polymer = function() {\n        console.error('You tried to use polymer without loading it first. To ' +\n          'load polymer, <link rel=\"import\" href=\"' + \n          'components/polymer/polymer.html\">');\n      };\n    }\n  });\n\n  // exports\n  scope.createDOM = createDOM;\n\n})(window.Platform);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n// poor man's adapter for template.content on various platform scenarios\nwindow.templateContent = window.templateContent || function(inTemplate) {\n  return inTemplate.content;\n};","(function(scope) {\n  \n  scope = scope || (window.Inspector = {});\n  \n  var inspector;\n\n  window.sinspect = function(inNode, inProxy) {\n    if (!inspector) {\n      inspector = window.open('', 'ShadowDOM Inspector', null, true);\n      inspector.document.write(inspectorHTML);\n      //inspector.document.close();\n      inspector.api = {\n        shadowize: shadowize\n      };\n    }\n    inspect(inNode || wrap(document.body), inProxy);\n  };\n\n  var inspectorHTML = [\n    '<!DOCTYPE html>',\n    '<html>',\n    '  <head>',\n    '    <title>ShadowDOM Inspector</title>',\n    '    <style>',\n    '      body {',\n    '      }',\n    '      pre {',\n    '        font: 9pt \"Courier New\", monospace;',\n    '        line-height: 1.5em;',\n    '      }',\n    '      tag {',\n    '        color: purple;',\n    '      }',\n    '      ul {',\n    '         margin: 0;',\n    '         padding: 0;',\n    '         list-style: none;',\n    '      }',\n    '      li {',\n    '         display: inline-block;',\n    '         background-color: #f1f1f1;',\n    '         padding: 4px 6px;',\n    '         border-radius: 4px;',\n    '         margin-right: 4px;',\n    '      }',\n    '    </style>',\n    '  </head>',\n    '  <body>',\n    '    <ul id=\"crumbs\">',\n    '    </ul>',\n    '    <div id=\"tree\"></div>',\n    '  </body>',\n    '</html>'\n  ].join('\\n');\n  \n  var crumbs = [];\n\n  var displayCrumbs = function() {\n    // alias our document\n    var d = inspector.document;\n    // get crumbbar\n    var cb = d.querySelector('#crumbs');\n    // clear crumbs\n    cb.textContent = '';\n    // build new crumbs\n    for (var i=0, c; c=crumbs[i]; i++) {\n      var a = d.createElement('a');\n      a.href = '#';\n      a.textContent = c.localName;\n      a.idx = i;\n      a.onclick = function(event) {\n        var c;\n        while (crumbs.length > this.idx) {\n          c = crumbs.pop();\n        }\n        inspect(c.shadow || c, c);\n        event.preventDefault();\n      };\n      cb.appendChild(d.createElement('li')).appendChild(a);\n    }\n  };\n\n  var inspect = function(inNode, inProxy) {\n    // alias our document\n    var d = inspector.document;\n    // reset list of drillable nodes\n    drillable = [];\n    // memoize our crumb proxy\n    var proxy = inProxy || inNode;\n    crumbs.push(proxy);\n    // update crumbs\n    displayCrumbs();\n    // reflect local tree\n    d.body.querySelector('#tree').innerHTML =\n        '<pre>' + output(inNode, inNode.childNodes) + '</pre>';\n  };\n\n  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n\n  var blacklisted = {STYLE:1, SCRIPT:1, \"#comment\": 1, TEMPLATE: 1};\n  var blacklist = function(inNode) {\n    return blacklisted[inNode.nodeName];\n  };\n\n  var output = function(inNode, inChildNodes, inIndent) {\n    if (blacklist(inNode)) {\n      return '';\n    }\n    var indent = inIndent || '';\n    if (inNode.localName || inNode.nodeType == 11) {\n      var name = inNode.localName || 'shadow-root';\n      //inChildNodes = ShadowDOM.localNodes(inNode);\n      var info = indent + describe(inNode);\n      // if only textNodes\n      // TODO(sjmiles): make correct for ShadowDOM\n      /*if (!inNode.children.length && inNode.localName !== 'content' && inNode.localName !== 'shadow') {\n        info += catTextContent(inChildNodes);\n      } else*/ {\n        // TODO(sjmiles): native <shadow> has no reference to its projection\n        if (name == 'content' /*|| name == 'shadow'*/) {\n          inChildNodes = inNode.getDistributedNodes();\n        }\n        info += '<br/>';\n        var ind = indent + '&nbsp;&nbsp;';\n        forEach(inChildNodes, function(n) {\n          info += output(n, n.childNodes, ind);\n        });\n        info += indent;\n      }\n      if (!({br:1}[name])) {\n        info += '<tag>&lt;/' + name + '&gt;</tag>';\n        info += '<br/>';\n      }\n    } else {\n      var text = inNode.textContent.trim();\n      info = text ? indent + '\"' + text + '\"' + '<br/>' : '';\n    }\n    return info;\n  };\n\n  var catTextContent = function(inChildNodes) {\n    var info = '';\n    forEach(inChildNodes, function(n) {\n      info += n.textContent.trim();\n    });\n    return info;\n  };\n\n  var drillable = [];\n\n  var describe = function(inNode) {\n    var tag = '<tag>' + '&lt;';\n    var name = inNode.localName || 'shadow-root';\n    if (inNode.webkitShadowRoot || inNode.shadowRoot) {\n      tag += ' <button idx=\"' + drillable.length +\n        '\" onclick=\"api.shadowize.call(this)\">' + name + '</button>';\n      drillable.push(inNode);\n    } else {\n      tag += name || 'shadow-root';\n    }\n    if (inNode.attributes) {\n      forEach(inNode.attributes, function(a) {\n        tag += ' ' + a.name + (a.value ? '=\"' + a.value + '\"' : '');\n      });\n    }\n    tag += '&gt;'+ '</tag>';\n    return tag;\n  };\n\n  // remote api\n\n  shadowize = function() {\n    var idx = Number(this.attributes.idx.value);\n    //alert(idx);\n    var node = drillable[idx];\n    if (node) {\n      inspect(node.webkitShadowRoot || node.shadowRoot, node)\n    } else {\n      console.log(\"bad shadowize node\");\n      console.dir(this);\n    }\n  };\n  \n  // export\n  \n  scope.output = output;\n  \n})(window.Inspector);\n\n\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope) {\n\n  // TODO(sorvell): It's desireable to provide a default stylesheet \n  // that's convenient for styling unresolved elements, but\n  // it's cumbersome to have to include this manually in every page.\n  // It would make sense to put inside some HTMLImport but \n  // the HTMLImports polyfill does not allow loading of stylesheets \n  // that block rendering. Therefore this injection is tolerated here.\n\n  var style = document.createElement('style');\n  style.textContent = ''\n      + 'body {'\n      + 'transition: opacity ease-in 0.2s;' \n      + ' } \\n'\n      + 'body[unresolved] {'\n      + 'opacity: 0; display: block; overflow: hidden;' \n      + ' } \\n'\n      ;\n  var head = document.querySelector('head');\n  head.insertBefore(style, head.firstChild);\n\n})(Platform);\n","(function(scope) {\n\n  function withDependencies(task, depends) {\n    depends = depends || [];\n    if (!depends.map) {\n      depends = [depends];\n    }\n    return task.apply(this, depends.map(marshal));\n  }\n\n  function module(name, dependsOrFactory, moduleFactory) {\n    var module;\n    switch (arguments.length) {\n      case 0:\n        return;\n      case 1:\n        module = null;\n        break;\n      case 2:\n        module = dependsOrFactory.apply(this);\n        break;\n      default:\n        module = withDependencies(moduleFactory, dependsOrFactory);\n        break;\n    }\n    modules[name] = module;\n  };\n\n  function marshal(name) {\n    return modules[name];\n  }\n\n  var modules = {};\n\n  function using(depends, task) {\n    HTMLImports.whenImportsReady(function() {\n      withDependencies(task, depends);\n    });\n  };\n\n  // exports\n\n  scope.marshal = marshal;\n  scope.module = module;\n  scope.using = using;\n\n})(window);","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope) {\n\nvar iterations = 0;\nvar callbacks = [];\nvar twiddle = document.createTextNode('');\n\nfunction endOfMicrotask(callback) {\n  twiddle.textContent = iterations++;\n  callbacks.push(callback);\n}\n\nfunction atEndOfMicrotask() {\n  while (callbacks.length) {\n    callbacks.shift()();\n  }\n}\n\nnew (window.MutationObserver || JsMutationObserver)(atEndOfMicrotask)\n  .observe(twiddle, {characterData: true})\n  ;\n\n// exports\n\nscope.endOfMicrotask = endOfMicrotask;\n\n})(Platform);\n\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\nvar urlResolver = {\n  resolveDom: function(root, url) {\n    url = url || root.ownerDocument.baseURI;\n    this.resolveAttributes(root, url);\n    this.resolveStyles(root, url);\n    // handle template.content\n    var templates = root.querySelectorAll('template');\n    if (templates) {\n      for (var i = 0, l = templates.length, t; (i < l) && (t = templates[i]); i++) {\n        if (t.content) {\n          this.resolveDom(t.content, url);\n        }\n      }\n    }\n  },\n  resolveTemplate: function(template) {\n    this.resolveDom(template.content, template.ownerDocument.baseURI);\n  },\n  resolveStyles: function(root, url) {\n    var styles = root.querySelectorAll('style');\n    if (styles) {\n      for (var i = 0, l = styles.length, s; (i < l) && (s = styles[i]); i++) {\n        this.resolveStyle(s, url);\n      }\n    }\n  },\n  resolveStyle: function(style, url) {\n    url = url || style.ownerDocument.baseURI;\n    style.textContent = this.resolveCssText(style.textContent, url);\n  },\n  resolveCssText: function(cssText, baseUrl) {\n    cssText = replaceUrlsInCssText(cssText, baseUrl, CSS_URL_REGEXP);\n    return replaceUrlsInCssText(cssText, baseUrl, CSS_IMPORT_REGEXP);\n  },\n  resolveAttributes: function(root, url) {\n    if (root.hasAttributes && root.hasAttributes()) {\n      this.resolveElementAttributes(root, url);\n    }\n    // search for attributes that host urls\n    var nodes = root && root.querySelectorAll(URL_ATTRS_SELECTOR);\n    if (nodes) {\n      for (var i = 0, l = nodes.length, n; (i < l) && (n = nodes[i]); i++) {\n        this.resolveElementAttributes(n, url);\n      }\n    }\n  },\n  resolveElementAttributes: function(node, url) {\n    url = url || node.ownerDocument.baseURI;\n    URL_ATTRS.forEach(function(v) {\n      var attr = node.attributes[v];\n      var value = attr && attr.value;\n      var replacement;\n      if (value && value.search(URL_TEMPLATE_SEARCH) < 0) {\n        if (v === 'style') {\n          replacement = replaceUrlsInCssText(value, url, CSS_URL_REGEXP);\n        } else {\n          replacement = resolveRelativeUrl(url, value);\n        }\n        attr.value = replacement;\n      }\n    });\n  }\n};\n\nvar CSS_URL_REGEXP = /(url\\()([^)]*)(\\))/g;\nvar CSS_IMPORT_REGEXP = /(@import[\\s]+(?!url\\())([^;]*)(;)/g;\nvar URL_ATTRS = ['href', 'src', 'action', 'style'];\nvar URL_ATTRS_SELECTOR = '[' + URL_ATTRS.join('],[') + ']';\nvar URL_TEMPLATE_SEARCH = '{{.*}}';\n\nfunction replaceUrlsInCssText(cssText, baseUrl, regexp) {\n  return cssText.replace(regexp, function(m, pre, url, post) {\n    var urlPath = url.replace(/[\"']/g, '');\n    urlPath = resolveRelativeUrl(baseUrl, urlPath);\n    return pre + '\\'' + urlPath + '\\'' + post;\n  });\n}\n\nfunction resolveRelativeUrl(baseUrl, url) {\n  var u = new URL(url, baseUrl);\n  return makeDocumentRelPath(u.href);\n}\n\nfunction makeDocumentRelPath(url) {\n  var root = document.location;\n  var u = new URL(url, root);\n  if (u.host === root.host && u.port === root.port &&\n      u.protocol === root.protocol) {\n    return makeRelPath(root.pathname, u.pathname);\n  } else {\n    return url;\n  }\n}\n\n// make a relative path from source to target\nfunction makeRelPath(source, target) {\n  var s = source.split('/');\n  var t = target.split('/');\n  while (s.length && s[0] === t[0]){\n    s.shift();\n    t.shift();\n  }\n  for (var i = 0, l = s.length - 1; i < l; i++) {\n    t.unshift('..');\n  }\n  return t.join('/');\n}\n\n// exports\nscope.urlResolver = urlResolver;\n\n})(Platform);\n","/*\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(global) {\n\n  var registrationsTable = new WeakMap();\n\n  // We use setImmediate or postMessage for our future callback.\n  var setImmediate = window.msSetImmediate;\n\n  // Use post message to emulate setImmediate.\n  if (!setImmediate) {\n    var setImmediateQueue = [];\n    var sentinel = String(Math.random());\n    window.addEventListener('message', function(e) {\n      if (e.data === sentinel) {\n        var queue = setImmediateQueue;\n        setImmediateQueue = [];\n        queue.forEach(function(func) {\n          func();\n        });\n      }\n    });\n    setImmediate = function(func) {\n      setImmediateQueue.push(func);\n      window.postMessage(sentinel, '*');\n    };\n  }\n\n  // This is used to ensure that we never schedule 2 callas to setImmediate\n  var isScheduled = false;\n\n  // Keep track of observers that needs to be notified next time.\n  var scheduledObservers = [];\n\n  /**\n   * Schedules |dispatchCallback| to be called in the future.\n   * @param {MutationObserver} observer\n   */\n  function scheduleCallback(observer) {\n    scheduledObservers.push(observer);\n    if (!isScheduled) {\n      isScheduled = true;\n      setImmediate(dispatchCallbacks);\n    }\n  }\n\n  function wrapIfNeeded(node) {\n    return window.ShadowDOMPolyfill &&\n        window.ShadowDOMPolyfill.wrapIfNeeded(node) ||\n        node;\n  }\n\n  function dispatchCallbacks() {\n    // http://dom.spec.whatwg.org/#mutation-observers\n\n    isScheduled = false; // Used to allow a new setImmediate call above.\n\n    var observers = scheduledObservers;\n    scheduledObservers = [];\n    // Sort observers based on their creation UID (incremental).\n    observers.sort(function(o1, o2) {\n      return o1.uid_ - o2.uid_;\n    });\n\n    var anyNonEmpty = false;\n    observers.forEach(function(observer) {\n\n      // 2.1, 2.2\n      var queue = observer.takeRecords();\n      // 2.3. Remove all transient registered observers whose observer is mo.\n      removeTransientObserversFor(observer);\n\n      // 2.4\n      if (queue.length) {\n        observer.callback_(queue, observer);\n        anyNonEmpty = true;\n      }\n    });\n\n    // 3.\n    if (anyNonEmpty)\n      dispatchCallbacks();\n  }\n\n  function removeTransientObserversFor(observer) {\n    observer.nodes_.forEach(function(node) {\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        return;\n      registrations.forEach(function(registration) {\n        if (registration.observer === observer)\n          registration.removeTransientObservers();\n      });\n    });\n  }\n\n  /**\n   * This function is used for the \"For each registered observer observer (with\n   * observer's options as options) in target's list of registered observers,\n   * run these substeps:\" and the \"For each ancestor ancestor of target, and for\n   * each registered observer observer (with options options) in ancestor's list\n   * of registered observers, run these substeps:\" part of the algorithms. The\n   * |options.subtree| is checked to ensure that the callback is called\n   * correctly.\n   *\n   * @param {Node} target\n   * @param {function(MutationObserverInit):MutationRecord} callback\n   */\n  function forEachAncestorAndObserverEnqueueRecord(target, callback) {\n    for (var node = target; node; node = node.parentNode) {\n      var registrations = registrationsTable.get(node);\n\n      if (registrations) {\n        for (var j = 0; j < registrations.length; j++) {\n          var registration = registrations[j];\n          var options = registration.options;\n\n          // Only target ignores subtree.\n          if (node !== target && !options.subtree)\n            continue;\n\n          var record = callback(options);\n          if (record)\n            registration.enqueue(record);\n        }\n      }\n    }\n  }\n\n  var uidCounter = 0;\n\n  /**\n   * The class that maps to the DOM MutationObserver interface.\n   * @param {Function} callback.\n   * @constructor\n   */\n  function JsMutationObserver(callback) {\n    this.callback_ = callback;\n    this.nodes_ = [];\n    this.records_ = [];\n    this.uid_ = ++uidCounter;\n  }\n\n  JsMutationObserver.prototype = {\n    observe: function(target, options) {\n      target = wrapIfNeeded(target);\n\n      // 1.1\n      if (!options.childList && !options.attributes && !options.characterData ||\n\n          // 1.2\n          options.attributeOldValue && !options.attributes ||\n\n          // 1.3\n          options.attributeFilter && options.attributeFilter.length &&\n              !options.attributes ||\n\n          // 1.4\n          options.characterDataOldValue && !options.characterData) {\n\n        throw new SyntaxError();\n      }\n\n      var registrations = registrationsTable.get(target);\n      if (!registrations)\n        registrationsTable.set(target, registrations = []);\n\n      // 2\n      // If target's list of registered observers already includes a registered\n      // observer associated with the context object, replace that registered\n      // observer's options with options.\n      var registration;\n      for (var i = 0; i < registrations.length; i++) {\n        if (registrations[i].observer === this) {\n          registration = registrations[i];\n          registration.removeListeners();\n          registration.options = options;\n          break;\n        }\n      }\n\n      // 3.\n      // Otherwise, add a new registered observer to target's list of registered\n      // observers with the context object as the observer and options as the\n      // options, and add target to context object's list of nodes on which it\n      // is registered.\n      if (!registration) {\n        registration = new Registration(this, target, options);\n        registrations.push(registration);\n        this.nodes_.push(target);\n      }\n\n      registration.addListeners();\n    },\n\n    disconnect: function() {\n      this.nodes_.forEach(function(node) {\n        var registrations = registrationsTable.get(node);\n        for (var i = 0; i < registrations.length; i++) {\n          var registration = registrations[i];\n          if (registration.observer === this) {\n            registration.removeListeners();\n            registrations.splice(i, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }, this);\n      this.records_ = [];\n    },\n\n    takeRecords: function() {\n      var copyOfRecords = this.records_;\n      this.records_ = [];\n      return copyOfRecords;\n    }\n  };\n\n  /**\n   * @param {string} type\n   * @param {Node} target\n   * @constructor\n   */\n  function MutationRecord(type, target) {\n    this.type = type;\n    this.target = target;\n    this.addedNodes = [];\n    this.removedNodes = [];\n    this.previousSibling = null;\n    this.nextSibling = null;\n    this.attributeName = null;\n    this.attributeNamespace = null;\n    this.oldValue = null;\n  }\n\n  function copyMutationRecord(original) {\n    var record = new MutationRecord(original.type, original.target);\n    record.addedNodes = original.addedNodes.slice();\n    record.removedNodes = original.removedNodes.slice();\n    record.previousSibling = original.previousSibling;\n    record.nextSibling = original.nextSibling;\n    record.attributeName = original.attributeName;\n    record.attributeNamespace = original.attributeNamespace;\n    record.oldValue = original.oldValue;\n    return record;\n  };\n\n  // We keep track of the two (possibly one) records used in a single mutation.\n  var currentRecord, recordWithOldValue;\n\n  /**\n   * Creates a record without |oldValue| and caches it as |currentRecord| for\n   * later use.\n   * @param {string} oldValue\n   * @return {MutationRecord}\n   */\n  function getRecord(type, target) {\n    return currentRecord = new MutationRecord(type, target);\n  }\n\n  /**\n   * Gets or creates a record with |oldValue| based in the |currentRecord|\n   * @param {string} oldValue\n   * @return {MutationRecord}\n   */\n  function getRecordWithOldValue(oldValue) {\n    if (recordWithOldValue)\n      return recordWithOldValue;\n    recordWithOldValue = copyMutationRecord(currentRecord);\n    recordWithOldValue.oldValue = oldValue;\n    return recordWithOldValue;\n  }\n\n  function clearRecords() {\n    currentRecord = recordWithOldValue = undefined;\n  }\n\n  /**\n   * @param {MutationRecord} record\n   * @return {boolean} Whether the record represents a record from the current\n   * mutation event.\n   */\n  function recordRepresentsCurrentMutation(record) {\n    return record === recordWithOldValue || record === currentRecord;\n  }\n\n  /**\n   * Selects which record, if any, to replace the last record in the queue.\n   * This returns |null| if no record should be replaced.\n   *\n   * @param {MutationRecord} lastRecord\n   * @param {MutationRecord} newRecord\n   * @param {MutationRecord}\n   */\n  function selectRecord(lastRecord, newRecord) {\n    if (lastRecord === newRecord)\n      return lastRecord;\n\n    // Check if the the record we are adding represents the same record. If\n    // so, we keep the one with the oldValue in it.\n    if (recordWithOldValue && recordRepresentsCurrentMutation(lastRecord))\n      return recordWithOldValue;\n\n    return null;\n  }\n\n  /**\n   * Class used to represent a registered observer.\n   * @param {MutationObserver} observer\n   * @param {Node} target\n   * @param {MutationObserverInit} options\n   * @constructor\n   */\n  function Registration(observer, target, options) {\n    this.observer = observer;\n    this.target = target;\n    this.options = options;\n    this.transientObservedNodes = [];\n  }\n\n  Registration.prototype = {\n    enqueue: function(record) {\n      var records = this.observer.records_;\n      var length = records.length;\n\n      // There are cases where we replace the last record with the new record.\n      // For example if the record represents the same mutation we need to use\n      // the one with the oldValue. If we get same record (this can happen as we\n      // walk up the tree) we ignore the new record.\n      if (records.length > 0) {\n        var lastRecord = records[length - 1];\n        var recordToReplaceLast = selectRecord(lastRecord, record);\n        if (recordToReplaceLast) {\n          records[length - 1] = recordToReplaceLast;\n          return;\n        }\n      } else {\n        scheduleCallback(this.observer);\n      }\n\n      records[length] = record;\n    },\n\n    addListeners: function() {\n      this.addListeners_(this.target);\n    },\n\n    addListeners_: function(node) {\n      var options = this.options;\n      if (options.attributes)\n        node.addEventListener('DOMAttrModified', this, true);\n\n      if (options.characterData)\n        node.addEventListener('DOMCharacterDataModified', this, true);\n\n      if (options.childList)\n        node.addEventListener('DOMNodeInserted', this, true);\n\n      if (options.childList || options.subtree)\n        node.addEventListener('DOMNodeRemoved', this, true);\n    },\n\n    removeListeners: function() {\n      this.removeListeners_(this.target);\n    },\n\n    removeListeners_: function(node) {\n      var options = this.options;\n      if (options.attributes)\n        node.removeEventListener('DOMAttrModified', this, true);\n\n      if (options.characterData)\n        node.removeEventListener('DOMCharacterDataModified', this, true);\n\n      if (options.childList)\n        node.removeEventListener('DOMNodeInserted', this, true);\n\n      if (options.childList || options.subtree)\n        node.removeEventListener('DOMNodeRemoved', this, true);\n    },\n\n    /**\n     * Adds a transient observer on node. The transient observer gets removed\n     * next time we deliver the change records.\n     * @param {Node} node\n     */\n    addTransientObserver: function(node) {\n      // Don't add transient observers on the target itself. We already have all\n      // the required listeners set up on the target.\n      if (node === this.target)\n        return;\n\n      this.addListeners_(node);\n      this.transientObservedNodes.push(node);\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        registrationsTable.set(node, registrations = []);\n\n      // We know that registrations does not contain this because we already\n      // checked if node === this.target.\n      registrations.push(this);\n    },\n\n    removeTransientObservers: function() {\n      var transientObservedNodes = this.transientObservedNodes;\n      this.transientObservedNodes = [];\n\n      transientObservedNodes.forEach(function(node) {\n        // Transient observers are never added to the target.\n        this.removeListeners_(node);\n\n        var registrations = registrationsTable.get(node);\n        for (var i = 0; i < registrations.length; i++) {\n          if (registrations[i] === this) {\n            registrations.splice(i, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }, this);\n    },\n\n    handleEvent: function(e) {\n      // Stop propagation since we are managing the propagation manually.\n      // This means that other mutation events on the page will not work\n      // correctly but that is by design.\n      e.stopImmediatePropagation();\n\n      switch (e.type) {\n        case 'DOMAttrModified':\n          // http://dom.spec.whatwg.org/#concept-mo-queue-attributes\n\n          var name = e.attrName;\n          var namespace = e.relatedNode.namespaceURI;\n          var target = e.target;\n\n          // 1.\n          var record = new getRecord('attributes', target);\n          record.attributeName = name;\n          record.attributeNamespace = namespace;\n\n          // 2.\n          var oldValue =\n              e.attrChange === MutationEvent.ADDITION ? null : e.prevValue;\n\n          forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n            // 3.1, 4.2\n            if (!options.attributes)\n              return;\n\n            // 3.2, 4.3\n            if (options.attributeFilter && options.attributeFilter.length &&\n                options.attributeFilter.indexOf(name) === -1 &&\n                options.attributeFilter.indexOf(namespace) === -1) {\n              return;\n            }\n            // 3.3, 4.4\n            if (options.attributeOldValue)\n              return getRecordWithOldValue(oldValue);\n\n            // 3.4, 4.5\n            return record;\n          });\n\n          break;\n\n        case 'DOMCharacterDataModified':\n          // http://dom.spec.whatwg.org/#concept-mo-queue-characterdata\n          var target = e.target;\n\n          // 1.\n          var record = getRecord('characterData', target);\n\n          // 2.\n          var oldValue = e.prevValue;\n\n\n          forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n            // 3.1, 4.2\n            if (!options.characterData)\n              return;\n\n            // 3.2, 4.3\n            if (options.characterDataOldValue)\n              return getRecordWithOldValue(oldValue);\n\n            // 3.3, 4.4\n            return record;\n          });\n\n          break;\n\n        case 'DOMNodeRemoved':\n          this.addTransientObserver(e.target);\n          // Fall through.\n        case 'DOMNodeInserted':\n          // http://dom.spec.whatwg.org/#concept-mo-queue-childlist\n          var target = e.relatedNode;\n          var changedNode = e.target;\n          var addedNodes, removedNodes;\n          if (e.type === 'DOMNodeInserted') {\n            addedNodes = [changedNode];\n            removedNodes = [];\n          } else {\n\n            addedNodes = [];\n            removedNodes = [changedNode];\n          }\n          var previousSibling = changedNode.previousSibling;\n          var nextSibling = changedNode.nextSibling;\n\n          // 1.\n          var record = getRecord('childList', target);\n          record.addedNodes = addedNodes;\n          record.removedNodes = removedNodes;\n          record.previousSibling = previousSibling;\n          record.nextSibling = nextSibling;\n\n          forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n            // 2.1, 3.2\n            if (!options.childList)\n              return;\n\n            // 2.2, 3.3\n            return record;\n          });\n\n      }\n\n      clearRecords();\n    }\n  };\n\n  global.JsMutationObserver = JsMutationObserver;\n\n  if (!global.MutationObserver)\n    global.MutationObserver = JsMutationObserver;\n\n\n})(this);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\nwindow.HTMLImports = window.HTMLImports || {flags:{}};","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\n  // imports\n  var path = scope.path;\n  var xhr = scope.xhr;\n  var flags = scope.flags;\n\n  // TODO(sorvell): this loader supports a dynamic list of urls\n  // and an oncomplete callback that is called when the loader is done.\n  // The polyfill currently does *not* need this dynamism or the onComplete\n  // concept. Because of this, the loader could be simplified quite a bit.\n  var Loader = function(onLoad, onComplete) {\n    this.cache = {};\n    this.onload = onLoad;\n    this.oncomplete = onComplete;\n    this.inflight = 0;\n    this.pending = {};\n  };\n\n  Loader.prototype = {\n    addNodes: function(nodes) {\n      // number of transactions to complete\n      this.inflight += nodes.length;\n      // commence transactions\n      for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n        this.require(n);\n      }\n      // anything to do?\n      this.checkDone();\n    },\n    addNode: function(node) {\n      // number of transactions to complete\n      this.inflight++;\n      // commence transactions\n      this.require(node);\n      // anything to do?\n      this.checkDone();\n    },\n    require: function(elt) {\n      var url = elt.src || elt.href;\n      // ensure we have a standard url that can be used\n      // reliably for deduping.\n      // TODO(sjmiles): ad-hoc\n      elt.__nodeUrl = url;\n      // deduplication\n      if (!this.dedupe(url, elt)) {\n        // fetch this resource\n        this.fetch(url, elt);\n      }\n    },\n    dedupe: function(url, elt) {\n      if (this.pending[url]) {\n        // add to list of nodes waiting for inUrl\n        this.pending[url].push(elt);\n        // don't need fetch\n        return true;\n      }\n      var resource;\n      if (this.cache[url]) {\n        this.onload(url, elt, this.cache[url]);\n        // finished this transaction\n        this.tail();\n        // don't need fetch\n        return true;\n      }\n      // first node waiting for inUrl\n      this.pending[url] = [elt];\n      // need fetch (not a dupe)\n      return false;\n    },\n    fetch: function(url, elt) {\n      flags.load && console.log('fetch', url, elt);\n      if (url.match(/^data:/)) {\n        // Handle Data URI Scheme\n        var pieces = url.split(',');\n        var header = pieces[0];\n        var body = pieces[1];\n        if(header.indexOf(';base64') > -1) {\n          body = atob(body);\n        } else {\n          body = decodeURIComponent(body);\n        }\n        setTimeout(function() {\n            this.receive(url, elt, null, body);\n        }.bind(this), 0);\n      } else {\n        var receiveXhr = function(err, resource) {\n          this.receive(url, elt, err, resource);\n        }.bind(this);\n        xhr.load(url, receiveXhr);\n        // TODO(sorvell): blocked on)\n        // https://code.google.com/p/chromium/issues/detail?id=257221\n        // xhr'ing for a document makes scripts in imports runnable; otherwise\n        // they are not; however, it requires that we have doctype=html in\n        // the import which is unacceptable. This is only needed on Chrome\n        // to avoid the bug above.\n        /*\n        if (isDocumentLink(elt)) {\n          xhr.loadDocument(url, receiveXhr);\n        } else {\n          xhr.load(url, receiveXhr);\n        }\n        */\n      }\n    },\n    receive: function(url, elt, err, resource) {\n      this.cache[url] = resource;\n      var $p = this.pending[url];\n      for (var i=0, l=$p.length, p; (i<l) && (p=$p[i]); i++) {\n        //if (!err) {\n          this.onload(url, p, resource);\n        //}\n        this.tail();\n      }\n      this.pending[url] = null;\n    },\n    tail: function() {\n      --this.inflight;\n      this.checkDone();\n    },\n    checkDone: function() {\n      if (!this.inflight) {\n        this.oncomplete();\n      }\n    }\n  };\n\n  xhr = xhr || {\n    async: true,\n    ok: function(request) {\n      return (request.status >= 200 && request.status < 300)\n          || (request.status === 304)\n          || (request.status === 0);\n    },\n    load: function(url, next, nextContext) {\n      var request = new XMLHttpRequest();\n      if (scope.flags.debug || scope.flags.bust) {\n        url += '?' + Math.random();\n      }\n      request.open('GET', url, xhr.async);\n      request.addEventListener('readystatechange', function(e) {\n        if (request.readyState === 4) {\n          next.call(nextContext, !xhr.ok(request) && request,\n              request.response || request.responseText, url);\n        }\n      });\n      request.send();\n      return request;\n    },\n    loadDocument: function(url, next, nextContext) {\n      this.load(url, next, nextContext).responseType = 'document';\n    }\n  };\n\n  // exports\n  scope.xhr = xhr;\n  scope.Loader = Loader;\n\n})(window.HTMLImports);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\nvar IMPORT_LINK_TYPE = 'import';\nvar flags = scope.flags;\nvar isIe = /Trident/.test(navigator.userAgent);\n// TODO(sorvell): SD polyfill intrusion\nvar mainDoc = window.ShadowDOMPolyfill ? \n    window.ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\n// importParser\n// highlander object to manage parsing of imports\n// parses import related elements\n// and ensures proper parse order\n// parse order is enforced by crawling the tree and monitoring which elements\n// have been parsed; async parsing is also supported.\n\n// highlander object for parsing a document tree\nvar importParser = {\n  // parse selectors for main document elements\n  documentSelectors: 'link[rel=' + IMPORT_LINK_TYPE + ']',\n  // parse selectors for import document elements\n  importsSelectors: [\n    'link[rel=' + IMPORT_LINK_TYPE + ']',\n    'link[rel=stylesheet]',\n    'style',\n    'script:not([type])',\n    'script[type=\"text/javascript\"]'\n  ].join(','),\n  map: {\n    link: 'parseLink',\n    script: 'parseScript',\n    style: 'parseStyle'\n  },\n  // try to parse the next import in the tree\n  parseNext: function() {\n    var next = this.nextToParse();\n    if (next) {\n      this.parse(next);\n    }\n  },\n  parse: function(elt) {\n    if (this.isParsed(elt)) {\n      flags.parse && console.log('[%s] is already parsed', elt.localName);\n      return;\n    }\n    var fn = this[this.map[elt.localName]];\n    if (fn) {\n      this.markParsing(elt);\n      fn.call(this, elt);\n    }\n  },\n  // only 1 element may be parsed at a time; parsing is async so, each\n  // parsing implementation must inform the system that parsing is complete\n  // via markParsingComplete.\n  markParsing: function(elt) {\n    flags.parse && console.log('parsing', elt);\n    this.parsingElement = elt;\n  },\n  markParsingComplete: function(elt) {\n    elt.__importParsed = true;\n    if (elt.__importElement) {\n      elt.__importElement.__importParsed = true;\n    }\n    this.parsingElement = null;\n    flags.parse && console.log('completed', elt);\n    this.parseNext();\n  },\n  parseImport: function(elt) {\n    elt.import.__importParsed = true;\n    // TODO(sorvell): consider if there's a better way to do this;\n    // expose an imports parsing hook; this is needed, for example, by the\n    // CustomElements polyfill.\n    if (HTMLImports.__importsParsingHook) {\n      HTMLImports.__importsParsingHook(elt);\n    }\n    // fire load event\n    if (elt.__resource) {\n      elt.dispatchEvent(new CustomEvent('load', {bubbles: false}));    \n    } else {\n      elt.dispatchEvent(new CustomEvent('error', {bubbles: false}));\n    }\n    // TODO(sorvell): workaround for Safari addEventListener not working\n    // for elements not in the main document.\n    if (elt.__pending) {\n      var fn;\n      while (elt.__pending.length) {\n        fn = elt.__pending.shift();\n        if (fn) {\n          fn({target: elt});\n        }\n      }\n    }\n    this.markParsingComplete(elt);\n  },\n  parseLink: function(linkElt) {\n    if (nodeIsImport(linkElt)) {\n      this.parseImport(linkElt);\n    } else {\n      // make href absolute\n      linkElt.href = linkElt.href;\n      this.parseGeneric(linkElt);\n    }\n  },\n  parseStyle: function(elt) {\n    // TODO(sorvell): style element load event can just not fire so clone styles\n    var src = elt;\n    elt = cloneStyle(elt);\n    elt.__importElement = src;\n    this.parseGeneric(elt);\n  },\n  parseGeneric: function(elt) {\n    this.trackElement(elt);\n    document.head.appendChild(elt);\n  },\n  // tracks when a loadable element has loaded\n  trackElement: function(elt, callback) {\n    var self = this;\n    var done = function(e) {\n      if (callback) {\n        callback(e);\n      }\n      self.markParsingComplete(elt);\n    };\n    elt.addEventListener('load', done);\n    elt.addEventListener('error', done);\n\n    // NOTE: IE does not fire \"load\" event for styles that have already loaded\n    // This is in violation of the spec, so we try our hardest to work around it\n    if (isIe && elt.localName === 'style') {\n      var fakeLoad = false;\n      // If there's not @import in the textContent, assume it has loaded\n      if (elt.textContent.indexOf('@import') == -1) {\n        fakeLoad = true;\n      // if we have a sheet, we have been parsed\n      } else if (elt.sheet) {\n        fakeLoad = true;\n        var csr = elt.sheet.cssRules;\n        var len = csr ? csr.length : 0;\n        // search the rules for @import's\n        for (var i = 0, r; (i < len) && (r = csr[i]); i++) {\n          if (r.type === CSSRule.IMPORT_RULE) {\n            // if every @import has resolved, fake the load\n            fakeLoad = fakeLoad && Boolean(r.styleSheet);\n          }\n        }\n      }\n      // dispatch a fake load event and continue parsing\n      if (fakeLoad) {\n        elt.dispatchEvent(new CustomEvent('load', {bubbles: false}));\n      }\n    }\n  },\n  // NOTE: execute scripts by injecting them and watching for the load/error\n  // event. Inline scripts are handled via dataURL's because browsers tend to\n  // provide correct parsing errors in this case. If this has any compatibility\n  // issues, we can switch to injecting the inline script with textContent.\n  // Scripts with dataURL's do not appear to generate load events and therefore\n  // we assume they execute synchronously.\n  parseScript: function(scriptElt) {\n    var script = document.createElement('script');\n    script.__importElement = scriptElt;\n    script.src = scriptElt.src ? scriptElt.src : \n        generateScriptDataUrl(scriptElt);\n    scope.currentScript = scriptElt;\n    this.trackElement(script, function(e) {\n      script.parentNode.removeChild(script);\n      scope.currentScript = null;  \n    });\n    document.head.appendChild(script);\n  },\n  // determine the next element in the tree which should be parsed\n  nextToParse: function() {\n    return !this.parsingElement && this.nextToParseInDoc(mainDoc);\n  },\n  nextToParseInDoc: function(doc, link) {\n    var nodes = doc.querySelectorAll(this.parseSelectorsForNode(doc));\n    for (var i=0, l=nodes.length, p=0, n; (i<l) && (n=nodes[i]); i++) {\n      if (!this.isParsed(n)) {\n        if (this.hasResource(n)) {\n          return nodeIsImport(n) ? this.nextToParseInDoc(n.import, n) : n;\n        } else {\n          return;\n        }\n      }\n    }\n    // all nodes have been parsed, ready to parse import, if any\n    return link;\n  },\n  // return the set of parse selectors relevant for this node.\n  parseSelectorsForNode: function(node) {\n    var doc = node.ownerDocument || node;\n    return doc === mainDoc ? this.documentSelectors : this.importsSelectors;\n  },\n  isParsed: function(node) {\n    return node.__importParsed;\n  },\n  hasResource: function(node) {\n    if (nodeIsImport(node) && !node.import) {\n      return false;\n    }\n    return true;\n  }\n};\n\nfunction nodeIsImport(elt) {\n  return (elt.localName === 'link') && (elt.rel === IMPORT_LINK_TYPE);\n}\n\nfunction generateScriptDataUrl(script) {\n  var scriptContent = generateScriptContent(script), b64;\n  try {\n    b64 = btoa(scriptContent);\n  } catch(e) {\n    b64 = btoa(unescape(encodeURIComponent(scriptContent)));\n    console.warn('Script contained non-latin characters that were forced ' +\n      'to latin. Some characters may be wrong.', script);\n  }\n  return 'data:text/javascript;base64,' + b64;\n}\n\nfunction generateScriptContent(script) {\n  return script.textContent + generateSourceMapHint(script);\n}\n\n// calculate source map hint\nfunction generateSourceMapHint(script) {\n  var moniker = script.__nodeUrl;\n  if (!moniker) {\n    moniker = script.ownerDocument.baseURI;\n    // there could be more than one script this url\n    var tag = '[' + Math.floor((Math.random()+1)*1000) + ']';\n    // TODO(sjmiles): Polymer hack, should be pluggable if we need to allow \n    // this sort of thing\n    var matches = script.textContent.match(/Polymer\\(['\"]([^'\"]*)/);\n    tag = matches && matches[1] || tag;\n    // tag the moniker\n    moniker += '/' + tag + '.js';\n  }\n  return '\\n//# sourceURL=' + moniker + '\\n';\n}\n\n// style/stylesheet handling\n\n// clone style with proper path resolution for main document\n// NOTE: styles are the only elements that require direct path fixup.\nfunction cloneStyle(style) {\n  var clone = style.ownerDocument.createElement('style');\n  clone.textContent = style.textContent;\n  path.resolveUrlsInStyle(clone);\n  return clone;\n}\n\n// path fixup: style elements in imports must be made relative to the main \n// document. We fixup url's in url() and @import.\nvar CSS_URL_REGEXP = /(url\\()([^)]*)(\\))/g;\nvar CSS_IMPORT_REGEXP = /(@import[\\s]+(?!url\\())([^;]*)(;)/g;\n\nvar path = {\n  resolveUrlsInStyle: function(style) {\n    var doc = style.ownerDocument;\n    var resolver = doc.createElement('a');\n    style.textContent = this.resolveUrlsInCssText(style.textContent, resolver);\n    return style;  \n  },\n  resolveUrlsInCssText: function(cssText, urlObj) {\n    var r = this.replaceUrls(cssText, urlObj, CSS_URL_REGEXP);\n    r = this.replaceUrls(r, urlObj, CSS_IMPORT_REGEXP);\n    return r;\n  },\n  replaceUrls: function(text, urlObj, regexp) {\n    return text.replace(regexp, function(m, pre, url, post) {\n      var urlPath = url.replace(/[\"']/g, '');\n      urlObj.href = urlPath;\n      urlPath = urlObj.href;\n      return pre + '\\'' + urlPath + '\\'' + post;\n    });    \n  }\n}\n\n// exports\nscope.parser = importParser;\nscope.path = path;\nscope.isIE = isIe;\n\n})(HTMLImports);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\nvar hasNative = ('import' in document.createElement('link'));\nvar useNative = hasNative;\nvar flags = scope.flags;\nvar IMPORT_LINK_TYPE = 'import';\n\n// TODO(sorvell): SD polyfill intrusion\nvar mainDoc = window.ShadowDOMPolyfill ? \n    ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\nif (!useNative) {\n\n  // imports\n  var xhr = scope.xhr;\n  var Loader = scope.Loader;\n  var parser = scope.parser;\n\n  // importer\n  // highlander object to manage loading of imports\n\n  // for any document, importer:\n  // - loads any linked import documents (with deduping)\n\n  var importer = {\n    documents: {},\n    // nodes to load in the mian document\n    documentPreloadSelectors: 'link[rel=' + IMPORT_LINK_TYPE + ']',\n    // nodes to load in imports\n    importsPreloadSelectors: [\n      'link[rel=' + IMPORT_LINK_TYPE + ']'\n    ].join(','),\n    loadNode: function(node) {\n      importLoader.addNode(node);\n    },\n    // load all loadable elements within the parent element\n    loadSubtree: function(parent) {\n      var nodes = this.marshalNodes(parent);\n      // add these nodes to loader's queue\n      importLoader.addNodes(nodes);\n    },\n    marshalNodes: function(parent) {\n      // all preloadable nodes in inDocument\n      return parent.querySelectorAll(this.loadSelectorsForNode(parent));\n    },\n    // find the proper set of load selectors for a given node\n    loadSelectorsForNode: function(node) {\n      var doc = node.ownerDocument || node;\n      return doc === mainDoc ? this.documentPreloadSelectors :\n          this.importsPreloadSelectors;\n    },\n    loaded: function(url, elt, resource) {\n      flags.load && console.log('loaded', url, elt);\n      // store generic resource\n      // TODO(sorvell): fails for nodes inside <template>.content\n      // see https://code.google.com/p/chromium/issues/detail?id=249381.\n      elt.__resource = resource;\n      if (isDocumentLink(elt)) {\n        var doc = this.documents[url];\n        // if we've never seen a document at this url\n        if (!doc) {\n          // generate an HTMLDocument from data\n          doc = makeDocument(resource, url);\n          doc.__importLink = elt;\n          // TODO(sorvell): we cannot use MO to detect parsed nodes because\n          // SD polyfill does not report these as mutations.\n          this.bootDocument(doc);\n          // cache document\n          this.documents[url] = doc;\n        }\n        // don't store import record until we're actually loaded\n        // store document resource\n        elt.import = doc;\n      }\n      parser.parseNext();\n    },\n    bootDocument: function(doc) {\n      this.loadSubtree(doc);\n      this.observe(doc);\n      parser.parseNext();\n    },\n    loadedAll: function() {\n      parser.parseNext();\n    }\n  };\n\n  // loader singleton\n  var importLoader = new Loader(importer.loaded.bind(importer), \n      importer.loadedAll.bind(importer));\n\n  function isDocumentLink(elt) {\n    return isLinkRel(elt, IMPORT_LINK_TYPE);\n  }\n\n  function isLinkRel(elt, rel) {\n    return elt.localName === 'link' && elt.getAttribute('rel') === rel;\n  }\n\n  function isScript(elt) {\n    return elt.localName === 'script';\n  }\n\n  function makeDocument(resource, url) {\n    // create a new HTML document\n    var doc = resource;\n    if (!(doc instanceof Document)) {\n      doc = document.implementation.createHTMLDocument(IMPORT_LINK_TYPE);\n    }\n    // cache the new document's source url\n    doc._URL = url;\n    // establish a relative path via <base>\n    var base = doc.createElement('base');\n    base.setAttribute('href', url);\n    // add baseURI support to browsers (IE) that lack it.\n    if (!doc.baseURI) {\n      doc.baseURI = url;\n    }\n    // ensure UTF-8 charset\n    var meta = doc.createElement('meta');\n    meta.setAttribute('charset', 'utf-8');\n\n    doc.head.appendChild(meta);\n    doc.head.appendChild(base);\n    // install HTML last as it may trigger CustomElement upgrades\n    // TODO(sjmiles): problem wrt to template boostrapping below,\n    // template bootstrapping must (?) come before element upgrade\n    // but we cannot bootstrap templates until they are in a document\n    // which is too late\n    if (!(resource instanceof Document)) {\n      // install html\n      doc.body.innerHTML = resource;\n    }\n    // TODO(sorvell): ideally this code is not aware of Template polyfill,\n    // but for now the polyfill needs help to bootstrap these templates\n    if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) {\n      HTMLTemplateElement.bootstrap(doc);\n    }\n    return doc;\n  }\n} else {\n  // do nothing if using native imports\n  var importer = {};\n}\n\n// NOTE: We cannot polyfill document.currentScript because it's not possible\n// both to override and maintain the ability to capture the native value;\n// therefore we choose to expose _currentScript both when native imports\n// and the polyfill are in use.\nvar currentScriptDescriptor = {\n  get: function() {\n    return HTMLImports.currentScript || document.currentScript;\n  },\n  configurable: true\n};\n\nObject.defineProperty(document, '_currentScript', currentScriptDescriptor);\nObject.defineProperty(mainDoc, '_currentScript', currentScriptDescriptor);\n\n// Polyfill document.baseURI for browsers without it.\nif (!document.baseURI) {\n  var baseURIDescriptor = {\n    get: function() {\n      return window.location.href;\n    },\n    configurable: true\n  };\n\n  Object.defineProperty(document, 'baseURI', baseURIDescriptor);\n  Object.defineProperty(mainDoc, 'baseURI', baseURIDescriptor);\n}\n\n// call a callback when all HTMLImports in the document at call (or at least\n//  document ready) time have loaded.\n// 1. ensure the document is in a ready state (has dom), then \n// 2. watch for loading of imports and call callback when done\nfunction whenImportsReady(callback, doc) {\n  doc = doc || mainDoc;\n  // if document is loading, wait and try again\n  whenDocumentReady(function() {\n    watchImportsLoad(callback, doc);\n  }, doc);\n}\n\n// call the callback when the document is in a ready state (has dom)\nvar requiredReadyState = HTMLImports.isIE ? 'complete' : 'interactive';\nvar READY_EVENT = 'readystatechange';\nfunction isDocumentReady(doc) {\n  return (doc.readyState === 'complete' ||\n      doc.readyState === requiredReadyState);\n}\n\n// call <callback> when we ensure the document is in a ready state\nfunction whenDocumentReady(callback, doc) {\n  if (!isDocumentReady(doc)) {\n    var checkReady = function() {\n      if (doc.readyState === 'complete' || \n          doc.readyState === requiredReadyState) {\n        doc.removeEventListener(READY_EVENT, checkReady);\n        whenDocumentReady(callback, doc);\n      }\n    }\n    doc.addEventListener(READY_EVENT, checkReady);\n  } else if (callback) {\n    callback();\n  }\n}\n\n// call <callback> when we ensure all imports have loaded\nfunction watchImportsLoad(callback, doc) {\n  var imports = doc.querySelectorAll('link[rel=import]');\n  var loaded = 0, l = imports.length;\n  function checkDone(d) { \n    if (loaded == l) {\n      // go async to ensure parser isn't stuck on a script tag\n      requestAnimationFrame(callback);\n    }\n  }\n  function loadedImport(e) {\n    loaded++;\n    checkDone();\n  }\n  if (l) {\n    for (var i=0, imp; (i<l) && (imp=imports[i]); i++) {\n      if (isImportLoaded(imp)) {\n        loadedImport.call(imp);\n      } else {\n        imp.addEventListener('load', loadedImport);\n        imp.addEventListener('error', loadedImport);\n      }\n    }\n  } else {\n    checkDone();\n  }\n}\n\nfunction isImportLoaded(link) {\n  return useNative ? (link.import && (link.import.readyState !== 'loading')) :\n      link.__importParsed;\n}\n\n// exports\nscope.hasNative = hasNative;\nscope.useNative = useNative;\nscope.importer = importer;\nscope.whenImportsReady = whenImportsReady;\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\nscope.isImportLoaded = isImportLoaded;\nscope.importLoader = importLoader;\n\n})(window.HTMLImports);\n"," /*\nCopyright 2013 The Polymer Authors. All rights reserved.\nUse of this source code is governed by a BSD-style\nlicense that can be found in the LICENSE file.\n*/\n\n(function(scope){\n\nvar IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;\nvar importSelector = 'link[rel=' + IMPORT_LINK_TYPE + ']';\nvar importer = scope.importer;\n\n// we track mutations for addedNodes, looking for imports\nfunction handler(mutations) {\n  for (var i=0, l=mutations.length, m; (i<l) && (m=mutations[i]); i++) {\n    if (m.type === 'childList' && m.addedNodes.length) {\n      addedNodes(m.addedNodes);\n    }\n  }\n}\n\n// find loadable elements and add them to the importer\nfunction addedNodes(nodes) {\n  for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n    if (shouldLoadNode(n)) {\n      importer.loadNode(n);\n    }\n    if (n.children && n.children.length) {\n      addedNodes(n.children);\n    }\n  }\n}\n\nfunction shouldLoadNode(node) {\n  return (node.nodeType === 1) && matches.call(node,\n      importer.loadSelectorsForNode(node));\n}\n\n// x-plat matches\nvar matches = HTMLElement.prototype.matches || \n    HTMLElement.prototype.matchesSelector || \n    HTMLElement.prototype.webkitMatchesSelector ||\n    HTMLElement.prototype.mozMatchesSelector ||\n    HTMLElement.prototype.msMatchesSelector;\n\nvar observer = new MutationObserver(handler);\n\n// observe the given root for loadable elements\nfunction observe(root) {\n  observer.observe(root, {childList: true, subtree: true});\n}\n\n// exports\n// TODO(sorvell): factor so can put on scope\nscope.observe = observe;\nimporter.observe = observe;\n\n})(HTMLImports);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(){\n\n// bootstrap\n\n// IE shim for CustomEvent\nif (typeof window.CustomEvent !== 'function') {\n  window.CustomEvent = function(inType, dictionary) {\n     var e = document.createEvent('HTMLEvents');\n     e.initEvent(inType,\n        dictionary.bubbles === false ? false : true,\n        dictionary.cancelable === false ? false : true,\n        dictionary.detail);\n     return e;\n  };\n}\n\n// TODO(sorvell): SD polyfill intrusion\nvar doc = window.ShadowDOMPolyfill ? \n    window.ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\n// Fire the 'HTMLImportsLoaded' event when imports in document at load time \n// have loaded. This event is required to simulate the script blocking \n// behavior of native imports. A main document script that needs to be sure\n// imports have loaded should wait for this event.\nHTMLImports.whenImportsReady(function() {\n  HTMLImports.ready = true;\n  HTMLImports.readyTime = new Date().getTime();\n  doc.dispatchEvent(\n    new CustomEvent('HTMLImportsLoaded', {bubbles: true})\n  );\n});\n\n\n// no need to bootstrap the polyfill when native imports is available.\nif (!HTMLImports.useNative) {\n  function bootstrap() {\n    HTMLImports.importer.bootDocument(doc);\n  }\n    \n  // TODO(sorvell): SD polyfill does *not* generate mutations for nodes added\n  // by the parser. For this reason, we must wait until the dom exists to \n  // bootstrap.\n  if (document.readyState === 'complete' ||\n      (document.readyState === 'interactive' && !window.attachEvent)) {\n    bootstrap();\n  } else {\n    document.addEventListener('DOMContentLoaded', bootstrap);\n  }\n}\n\n})();\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\nwindow.CustomElements = window.CustomElements || {flags:{}};"," /*\r\nCopyright 2013 The Polymer Authors. All rights reserved.\r\nUse of this source code is governed by a BSD-style\r\nlicense that can be found in the LICENSE file.\r\n*/\r\n\r\n(function(scope){\r\n\r\nvar logFlags = window.logFlags || {};\r\nvar IMPORT_LINK_TYPE = window.HTMLImports ? HTMLImports.IMPORT_LINK_TYPE : 'none';\r\n\r\n// walk the subtree rooted at node, applying 'find(element, data)' function\r\n// to each element\r\n// if 'find' returns true for 'element', do not search element's subtree\r\nfunction findAll(node, find, data) {\r\n  var e = node.firstElementChild;\r\n  if (!e) {\r\n    e = node.firstChild;\r\n    while (e && e.nodeType !== Node.ELEMENT_NODE) {\r\n      e = e.nextSibling;\r\n    }\r\n  }\r\n  while (e) {\r\n    if (find(e, data) !== true) {\r\n      findAll(e, find, data);\r\n    }\r\n    e = e.nextElementSibling;\r\n  }\r\n  return null;\r\n}\r\n\r\n// walk all shadowRoots on a given node.\r\nfunction forRoots(node, cb) {\r\n  var root = node.shadowRoot;\r\n  while(root) {\r\n    forSubtree(root, cb);\r\n    root = root.olderShadowRoot;\r\n  }\r\n}\r\n\r\n// walk the subtree rooted at node, including descent into shadow-roots,\r\n// applying 'cb' to each element\r\nfunction forSubtree(node, cb) {\r\n  //logFlags.dom && node.childNodes && node.childNodes.length && console.group('subTree: ', node);\r\n  findAll(node, function(e) {\r\n    if (cb(e)) {\r\n      return true;\r\n    }\r\n    forRoots(e, cb);\r\n  });\r\n  forRoots(node, cb);\r\n  //logFlags.dom && node.childNodes && node.childNodes.length && console.groupEnd();\r\n}\r\n\r\n// manage lifecycle on added node\r\nfunction added(node) {\r\n  if (upgrade(node)) {\r\n    insertedNode(node);\r\n    return true;\r\n  }\r\n  inserted(node);\r\n}\r\n\r\n// manage lifecycle on added node's subtree only\r\nfunction addedSubtree(node) {\r\n  forSubtree(node, function(e) {\r\n    if (added(e)) {\r\n      return true;\r\n    }\r\n  });\r\n}\r\n\r\n// manage lifecycle on added node and it's subtree\r\nfunction addedNode(node) {\r\n  return added(node) || addedSubtree(node);\r\n}\r\n\r\n// upgrade custom elements at node, if applicable\r\nfunction upgrade(node) {\r\n  if (!node.__upgraded__ && node.nodeType === Node.ELEMENT_NODE) {\r\n    var type = node.getAttribute('is') || node.localName;\r\n    var definition = scope.registry[type];\r\n    if (definition) {\r\n      logFlags.dom && console.group('upgrade:', node.localName);\r\n      scope.upgrade(node);\r\n      logFlags.dom && console.groupEnd();\r\n      return true;\r\n    }\r\n  }\r\n}\r\n\r\nfunction insertedNode(node) {\r\n  inserted(node);\r\n  if (inDocument(node)) {\r\n    forSubtree(node, function(e) {\r\n      inserted(e);\r\n    });\r\n  }\r\n}\r\n\r\n// TODO(sorvell): on platforms without MutationObserver, mutations may not be\r\n// reliable and therefore attached/detached are not reliable.\r\n// To make these callbacks less likely to fail, we defer all inserts and removes\r\n// to give a chance for elements to be inserted into dom.\r\n// This ensures attachedCallback fires for elements that are created and\r\n// immediately added to dom.\r\nvar hasPolyfillMutations = (!window.MutationObserver ||\r\n    (window.MutationObserver === window.JsMutationObserver));\r\nscope.hasPolyfillMutations = hasPolyfillMutations;\r\n\r\nvar isPendingMutations = false;\r\nvar pendingMutations = [];\r\nfunction deferMutation(fn) {\r\n  pendingMutations.push(fn);\r\n  if (!isPendingMutations) {\r\n    isPendingMutations = true;\r\n    var async = (window.Platform && window.Platform.endOfMicrotask) ||\r\n        setTimeout;\r\n    async(takeMutations);\r\n  }\r\n}\r\n\r\nfunction takeMutations() {\r\n  isPendingMutations = false;\r\n  var $p = pendingMutations;\r\n  for (var i=0, l=$p.length, p; (i<l) && (p=$p[i]); i++) {\r\n    p();\r\n  }\r\n  pendingMutations = [];\r\n}\r\n\r\nfunction inserted(element) {\r\n  if (hasPolyfillMutations) {\r\n    deferMutation(function() {\r\n      _inserted(element);\r\n    });\r\n  } else {\r\n    _inserted(element);\r\n  }\r\n}\r\n\r\n// TODO(sjmiles): if there are descents into trees that can never have inDocument(*) true, fix this\r\nfunction _inserted(element) {\r\n  // TODO(sjmiles): it's possible we were inserted and removed in the space\r\n  // of one microtask, in which case we won't be 'inDocument' here\r\n  // But there are other cases where we are testing for inserted without\r\n  // specific knowledge of mutations, and must test 'inDocument' to determine\r\n  // whether to call inserted\r\n  // If we can factor these cases into separate code paths we can have\r\n  // better diagnostics.\r\n  // TODO(sjmiles): when logging, do work on all custom elements so we can\r\n  // track behavior even when callbacks not defined\r\n  //console.log('inserted: ', element.localName);\r\n  if (element.attachedCallback || element.detachedCallback || (element.__upgraded__ && logFlags.dom)) {\r\n    logFlags.dom && console.group('inserted:', element.localName);\r\n    if (inDocument(element)) {\r\n      element.__inserted = (element.__inserted || 0) + 1;\r\n      // if we are in a 'removed' state, bluntly adjust to an 'inserted' state\r\n      if (element.__inserted < 1) {\r\n        element.__inserted = 1;\r\n      }\r\n      // if we are 'over inserted', squelch the callback\r\n      if (element.__inserted > 1) {\r\n        logFlags.dom && console.warn('inserted:', element.localName,\r\n          'insert/remove count:', element.__inserted)\r\n      } else if (element.attachedCallback) {\r\n        logFlags.dom && console.log('inserted:', element.localName);\r\n        element.attachedCallback();\r\n      }\r\n    }\r\n    logFlags.dom && console.groupEnd();\r\n  }\r\n}\r\n\r\nfunction removedNode(node) {\r\n  removed(node);\r\n  forSubtree(node, function(e) {\r\n    removed(e);\r\n  });\r\n}\r\n\r\nfunction removed(element) {\r\n  if (hasPolyfillMutations) {\r\n    deferMutation(function() {\r\n      _removed(element);\r\n    });\r\n  } else {\r\n    _removed(element);\r\n  }\r\n}\r\n\r\nfunction _removed(element) {\r\n  // TODO(sjmiles): temporary: do work on all custom elements so we can track\r\n  // behavior even when callbacks not defined\r\n  if (element.attachedCallback || element.detachedCallback || (element.__upgraded__ && logFlags.dom)) {\r\n    logFlags.dom && console.group('removed:', element.localName);\r\n    if (!inDocument(element)) {\r\n      element.__inserted = (element.__inserted || 0) - 1;\r\n      // if we are in a 'inserted' state, bluntly adjust to an 'removed' state\r\n      if (element.__inserted > 0) {\r\n        element.__inserted = 0;\r\n      }\r\n      // if we are 'over removed', squelch the callback\r\n      if (element.__inserted < 0) {\r\n        logFlags.dom && console.warn('removed:', element.localName,\r\n            'insert/remove count:', element.__inserted)\r\n      } else if (element.detachedCallback) {\r\n        element.detachedCallback();\r\n      }\r\n    }\r\n    logFlags.dom && console.groupEnd();\r\n  }\r\n}\r\n\r\n// SD polyfill intrustion due mainly to the fact that 'document'\r\n// is not entirely wrapped\r\nfunction wrapIfNeeded(node) {\r\n  return window.ShadowDOMPolyfill ? ShadowDOMPolyfill.wrapIfNeeded(node)\r\n      : node;\r\n}\r\n\r\nfunction inDocument(element) {\r\n  var p = element;\r\n  var doc = wrapIfNeeded(document);\r\n  while (p) {\r\n    if (p == doc) {\r\n      return true;\r\n    }\r\n    p = p.parentNode || p.host;\r\n  }\r\n}\r\n\r\nfunction watchShadow(node) {\r\n  if (node.shadowRoot && !node.shadowRoot.__watched) {\r\n    logFlags.dom && console.log('watching shadow-root for: ', node.localName);\r\n    // watch all unwatched roots...\r\n    var root = node.shadowRoot;\r\n    while (root) {\r\n      watchRoot(root);\r\n      root = root.olderShadowRoot;\r\n    }\r\n  }\r\n}\r\n\r\nfunction watchRoot(root) {\r\n  if (!root.__watched) {\r\n    observe(root);\r\n    root.__watched = true;\r\n  }\r\n}\r\n\r\nfunction handler(mutations) {\r\n  //\r\n  if (logFlags.dom) {\r\n    var mx = mutations[0];\r\n    if (mx && mx.type === 'childList' && mx.addedNodes) {\r\n        if (mx.addedNodes) {\r\n          var d = mx.addedNodes[0];\r\n          while (d && d !== document && !d.host) {\r\n            d = d.parentNode;\r\n          }\r\n          var u = d && (d.URL || d._URL || (d.host && d.host.localName)) || '';\r\n          u = u.split('/?').shift().split('/').pop();\r\n        }\r\n    }\r\n    console.group('mutations (%d) [%s]', mutations.length, u || '');\r\n  }\r\n  //\r\n  mutations.forEach(function(mx) {\r\n    //logFlags.dom && console.group('mutation');\r\n    if (mx.type === 'childList') {\r\n      forEach(mx.addedNodes, function(n) {\r\n        //logFlags.dom && console.log(n.localName);\r\n        if (!n.localName) {\r\n          return;\r\n        }\r\n        // nodes added may need lifecycle management\r\n        addedNode(n);\r\n      });\r\n      // removed nodes may need lifecycle management\r\n      forEach(mx.removedNodes, function(n) {\r\n        //logFlags.dom && console.log(n.localName);\r\n        if (!n.localName) {\r\n          return;\r\n        }\r\n        removedNode(n);\r\n      });\r\n    }\r\n    //logFlags.dom && console.groupEnd();\r\n  });\r\n  logFlags.dom && console.groupEnd();\r\n};\r\n\r\nvar observer = new MutationObserver(handler);\r\n\r\nfunction takeRecords() {\r\n  // TODO(sjmiles): ask Raf why we have to call handler ourselves\r\n  handler(observer.takeRecords());\r\n  takeMutations();\r\n}\r\n\r\nvar forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\r\n\r\nfunction observe(inRoot) {\r\n  observer.observe(inRoot, {childList: true, subtree: true});\r\n}\r\n\r\nfunction observeDocument(doc) {\r\n  observe(doc);\r\n}\r\n\r\nfunction upgradeDocument(doc) {\r\n  logFlags.dom && console.group('upgradeDocument: ', (doc.baseURI).split('/').pop());\r\n  addedNode(doc);\r\n  logFlags.dom && console.groupEnd();\r\n}\r\n\r\nfunction upgradeDocumentTree(doc) {\r\n  doc = wrapIfNeeded(doc);\r\n  //console.log('upgradeDocumentTree: ', (doc.baseURI).split('/').pop());\r\n  // upgrade contained imported documents\r\n  var imports = doc.querySelectorAll('link[rel=' + IMPORT_LINK_TYPE + ']');\r\n  for (var i=0, l=imports.length, n; (i<l) && (n=imports[i]); i++) {\r\n    if (n.import && n.import.__parsed) {\r\n      upgradeDocumentTree(n.import);\r\n    }\r\n  }\r\n  upgradeDocument(doc);\r\n}\r\n\r\n// exports\r\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\r\nscope.watchShadow = watchShadow;\r\nscope.upgradeDocumentTree = upgradeDocumentTree;\r\nscope.upgradeAll = addedNode;\r\nscope.upgradeSubtree = addedSubtree;\r\nscope.insertedNode = insertedNode;\r\n\r\nscope.observeDocument = observeDocument;\r\nscope.upgradeDocument = upgradeDocument;\r\n\r\nscope.takeRecords = takeRecords;\r\n\r\n})(window.CustomElements);\r\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * Implements `document.register`\n * @module CustomElements\n*/\n\n/**\n * Polyfilled extensions to the `document` object.\n * @class Document\n*/\n\n(function(scope) {\n\n// imports\n\nif (!scope) {\n  scope = window.CustomElements = {flags:{}};\n}\nvar flags = scope.flags;\n\n// native document.registerElement?\n\nvar hasNative = Boolean(document.registerElement);\n// TODO(sorvell): See https://github.com/Polymer/polymer/issues/399\n// we'll address this by defaulting to CE polyfill in the presence of the SD\n// polyfill. This will avoid spamming excess attached/detached callbacks.\n// If there is a compelling need to run CE native with SD polyfill,\n// we'll need to fix this issue.\nvar useNative = !flags.register && hasNative && !window.ShadowDOMPolyfill;\n\nif (useNative) {\n\n  // stub\n  var nop = function() {};\n\n  // exports\n  scope.registry = {};\n  scope.upgradeElement = nop;\n\n  scope.watchShadow = nop;\n  scope.upgrade = nop;\n  scope.upgradeAll = nop;\n  scope.upgradeSubtree = nop;\n  scope.observeDocument = nop;\n  scope.upgradeDocument = nop;\n  scope.upgradeDocumentTree = nop;\n  scope.takeRecords = nop;\n  scope.reservedTagList = [];\n\n} else {\n\n  /**\n   * Registers a custom tag name with the document.\n   *\n   * When a registered element is created, a `readyCallback` method is called\n   * in the scope of the element. The `readyCallback` method can be specified on\n   * either `options.prototype` or `options.lifecycle` with the latter taking\n   * precedence.\n   *\n   * @method register\n   * @param {String} name The tag name to register. Must include a dash ('-'),\n   *    for example 'x-component'.\n   * @param {Object} options\n   *    @param {String} [options.extends]\n   *      (_off spec_) Tag name of an element to extend (or blank for a new\n   *      element). This parameter is not part of the specification, but instead\n   *      is a hint for the polyfill because the extendee is difficult to infer.\n   *      Remember that the input prototype must chain to the extended element's\n   *      prototype (or HTMLElement.prototype) regardless of the value of\n   *      `extends`.\n   *    @param {Object} options.prototype The prototype to use for the new\n   *      element. The prototype must inherit from HTMLElement.\n   *    @param {Object} [options.lifecycle]\n   *      Callbacks that fire at important phases in the life of the custom\n   *      element.\n   *\n   * @example\n   *      FancyButton = document.registerElement(\"fancy-button\", {\n   *        extends: 'button',\n   *        prototype: Object.create(HTMLButtonElement.prototype, {\n   *          readyCallback: {\n   *            value: function() {\n   *              console.log(\"a fancy-button was created\",\n   *            }\n   *          }\n   *        })\n   *      });\n   * @return {Function} Constructor for the newly registered type.\n   */\n  function register(name, options) {\n    //console.warn('document.registerElement(\"' + name + '\", ', options, ')');\n    // construct a defintion out of options\n    // TODO(sjmiles): probably should clone options instead of mutating it\n    var definition = options || {};\n    if (!name) {\n      // TODO(sjmiles): replace with more appropriate error (EricB can probably\n      // offer guidance)\n      throw new Error('document.registerElement: first argument `name` must not be empty');\n    }\n    if (name.indexOf('-') < 0) {\n      // TODO(sjmiles): replace with more appropriate error (EricB can probably\n      // offer guidance)\n      throw new Error('document.registerElement: first argument (\\'name\\') must contain a dash (\\'-\\'). Argument provided was \\'' + String(name) + '\\'.');\n    }\n    // prevent registering reserved names\n    if (isReservedTag(name)) {\n      throw new Error('Failed to execute \\'registerElement\\' on \\'Document\\': Registration failed for type \\'' + String(name) + '\\'. The type name is invalid.');\n    }\n    // elements may only be registered once\n    if (getRegisteredDefinition(name)) {\n      throw new Error('DuplicateDefinitionError: a type with name \\'' + String(name) + '\\' is already registered');\n    }\n    // must have a prototype, default to an extension of HTMLElement\n    // TODO(sjmiles): probably should throw if no prototype, check spec\n    if (!definition.prototype) {\n      // TODO(sjmiles): replace with more appropriate error (EricB can probably\n      // offer guidance)\n      throw new Error('Options missing required prototype property');\n    }\n    // record name\n    definition.__name = name.toLowerCase();\n    // ensure a lifecycle object so we don't have to null test it\n    definition.lifecycle = definition.lifecycle || {};\n    // build a list of ancestral custom elements (for native base detection)\n    // TODO(sjmiles): we used to need to store this, but current code only\n    // uses it in 'resolveTagName': it should probably be inlined\n    definition.ancestry = ancestry(definition.extends);\n    // extensions of native specializations of HTMLElement require localName\n    // to remain native, and use secondary 'is' specifier for extension type\n    resolveTagName(definition);\n    // some platforms require modifications to the user-supplied prototype\n    // chain\n    resolvePrototypeChain(definition);\n    // overrides to implement attributeChanged callback\n    overrideAttributeApi(definition.prototype);\n    // 7.1.5: Register the DEFINITION with DOCUMENT\n    registerDefinition(definition.__name, definition);\n    // 7.1.7. Run custom element constructor generation algorithm with PROTOTYPE\n    // 7.1.8. Return the output of the previous step.\n    definition.ctor = generateConstructor(definition);\n    definition.ctor.prototype = definition.prototype;\n    // force our .constructor to be our actual constructor\n    definition.prototype.constructor = definition.ctor;\n    // if initial parsing is complete\n    if (scope.ready) {\n      // upgrade any pre-existing nodes of this type\n      scope.upgradeDocumentTree(document);\n    }\n    return definition.ctor;\n  }\n\n  function isReservedTag(name) {\n    for (var i = 0; i < reservedTagList.length; i++) {\n      if (name === reservedTagList[i]) {\n        return true;\n      }\n    }\n  }\n\n  var reservedTagList = [\n    'annotation-xml', 'color-profile', 'font-face', 'font-face-src',\n    'font-face-uri', 'font-face-format', 'font-face-name', 'missing-glyph'\n  ];\n\n  function ancestry(extnds) {\n    var extendee = getRegisteredDefinition(extnds);\n    if (extendee) {\n      return ancestry(extendee.extends).concat([extendee]);\n    }\n    return [];\n  }\n\n  function resolveTagName(definition) {\n    // if we are explicitly extending something, that thing is our\n    // baseTag, unless it represents a custom component\n    var baseTag = definition.extends;\n    // if our ancestry includes custom components, we only have a\n    // baseTag if one of them does\n    for (var i=0, a; (a=definition.ancestry[i]); i++) {\n      baseTag = a.is && a.tag;\n    }\n    // our tag is our baseTag, if it exists, and otherwise just our name\n    definition.tag = baseTag || definition.__name;\n    if (baseTag) {\n      // if there is a base tag, use secondary 'is' specifier\n      definition.is = definition.__name;\n    }\n  }\n\n  function resolvePrototypeChain(definition) {\n    // if we don't support __proto__ we need to locate the native level\n    // prototype for precise mixing in\n    if (!Object.__proto__) {\n      // default prototype\n      var nativePrototype = HTMLElement.prototype;\n      // work out prototype when using type-extension\n      if (definition.is) {\n        var inst = document.createElement(definition.tag);\n        nativePrototype = Object.getPrototypeOf(inst);\n      }\n      // ensure __proto__ reference is installed at each point on the prototype\n      // chain.\n      // NOTE: On platforms without __proto__, a mixin strategy is used instead\n      // of prototype swizzling. In this case, this generated __proto__ provides\n      // limited support for prototype traversal.\n      var proto = definition.prototype, ancestor;\n      while (proto && (proto !== nativePrototype)) {\n        var ancestor = Object.getPrototypeOf(proto);\n        proto.__proto__ = ancestor;\n        proto = ancestor;\n      }\n    }\n    // cache this in case of mixin\n    definition.native = nativePrototype;\n  }\n\n  // SECTION 4\n\n  function instantiate(definition) {\n    // 4.a.1. Create a new object that implements PROTOTYPE\n    // 4.a.2. Let ELEMENT by this new object\n    //\n    // the custom element instantiation algorithm must also ensure that the\n    // output is a valid DOM element with the proper wrapper in place.\n    //\n    return upgrade(domCreateElement(definition.tag), definition);\n  }\n\n  function upgrade(element, definition) {\n    // some definitions specify an 'is' attribute\n    if (definition.is) {\n      element.setAttribute('is', definition.is);\n    }\n    // remove 'unresolved' attr, which is a standin for :unresolved.\n    element.removeAttribute('unresolved');\n    // make 'element' implement definition.prototype\n    implement(element, definition);\n    // flag as upgraded\n    element.__upgraded__ = true;\n    // lifecycle management\n    created(element);\n    // attachedCallback fires in tree order, call before recursing\n    scope.insertedNode(element);\n    // there should never be a shadow root on element at this point\n    scope.upgradeSubtree(element);\n    // OUTPUT\n    return element;\n  }\n\n  function implement(element, definition) {\n    // prototype swizzling is best\n    if (Object.__proto__) {\n      element.__proto__ = definition.prototype;\n    } else {\n      // where above we can re-acquire inPrototype via\n      // getPrototypeOf(Element), we cannot do so when\n      // we use mixin, so we install a magic reference\n      customMixin(element, definition.prototype, definition.native);\n      element.__proto__ = definition.prototype;\n    }\n  }\n\n  function customMixin(inTarget, inSrc, inNative) {\n    // TODO(sjmiles): 'used' allows us to only copy the 'youngest' version of\n    // any property. This set should be precalculated. We also need to\n    // consider this for supporting 'super'.\n    var used = {};\n    // start with inSrc\n    var p = inSrc;\n    // The default is HTMLElement.prototype, so we add a test to avoid mixing in\n    // native prototypes\n    while (p !== inNative && p !== HTMLElement.prototype) {\n      var keys = Object.getOwnPropertyNames(p);\n      for (var i=0, k; k=keys[i]; i++) {\n        if (!used[k]) {\n          Object.defineProperty(inTarget, k,\n              Object.getOwnPropertyDescriptor(p, k));\n          used[k] = 1;\n        }\n      }\n      p = Object.getPrototypeOf(p);\n    }\n  }\n\n  function created(element) {\n    // invoke createdCallback\n    if (element.createdCallback) {\n      element.createdCallback();\n    }\n  }\n\n  // attribute watching\n\n  function overrideAttributeApi(prototype) {\n    // overrides to implement callbacks\n    // TODO(sjmiles): should support access via .attributes NamedNodeMap\n    // TODO(sjmiles): preserves user defined overrides, if any\n    if (prototype.setAttribute._polyfilled) {\n      return;\n    }\n    var setAttribute = prototype.setAttribute;\n    prototype.setAttribute = function(name, value) {\n      changeAttribute.call(this, name, value, setAttribute);\n    }\n    var removeAttribute = prototype.removeAttribute;\n    prototype.removeAttribute = function(name) {\n      changeAttribute.call(this, name, null, removeAttribute);\n    }\n    prototype.setAttribute._polyfilled = true;\n  }\n\n  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/custom/\n  // index.html#dfn-attribute-changed-callback\n  function changeAttribute(name, value, operation) {\n    var oldValue = this.getAttribute(name);\n    operation.apply(this, arguments);\n    var newValue = this.getAttribute(name);\n    if (this.attributeChangedCallback\n        && (newValue !== oldValue)) {\n      this.attributeChangedCallback(name, oldValue, newValue);\n    }\n  }\n\n  // element registry (maps tag names to definitions)\n\n  var registry = {};\n\n  function getRegisteredDefinition(name) {\n    if (name) {\n      return registry[name.toLowerCase()];\n    }\n  }\n\n  function registerDefinition(name, definition) {\n    registry[name] = definition;\n  }\n\n  function generateConstructor(definition) {\n    return function() {\n      return instantiate(definition);\n    };\n  }\n\n  var HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';\n  function createElementNS(namespace, tag, typeExtension) {\n    // NOTE: we do not support non-HTML elements,\n    // just call createElementNS for non HTML Elements\n    if (namespace === HTML_NAMESPACE) {\n      return createElement(tag, typeExtension);\n    } else {\n      return domCreateElementNS(namespace, tag);\n    }\n  }\n\n  function createElement(tag, typeExtension) {\n    // TODO(sjmiles): ignore 'tag' when using 'typeExtension', we could\n    // error check it, or perhaps there should only ever be one argument\n    var definition = getRegisteredDefinition(typeExtension || tag);\n    if (definition) {\n      if (tag == definition.tag && typeExtension == definition.is) {\n        return new definition.ctor();\n      }\n      // Handle empty string for type extension.\n      if (!typeExtension && !definition.is) {\n        return new definition.ctor();\n      }\n    }\n\n    if (typeExtension) {\n      var element = createElement(tag);\n      element.setAttribute('is', typeExtension);\n      return element;\n    }\n    var element = domCreateElement(tag);\n    // Custom tags should be HTMLElements even if not upgraded.\n    if (tag.indexOf('-') >= 0) {\n      implement(element, HTMLElement);\n    }\n    return element;\n  }\n\n  function upgradeElement(element) {\n    if (!element.__upgraded__ && (element.nodeType === Node.ELEMENT_NODE)) {\n      var is = element.getAttribute('is');\n      var definition = getRegisteredDefinition(is || element.localName);\n      if (definition) {\n        if (is && definition.tag == element.localName) {\n          return upgrade(element, definition);\n        } else if (!is && !definition.extends) {\n          return upgrade(element, definition);\n        }\n      }\n    }\n  }\n\n  function cloneNode(deep) {\n    // call original clone\n    var n = domCloneNode.call(this, deep);\n    // upgrade the element and subtree\n    scope.upgradeAll(n);\n    // return the clone\n    return n;\n  }\n  // capture native createElement before we override it\n\n  var domCreateElement = document.createElement.bind(document);\n  var domCreateElementNS = document.createElementNS.bind(document);\n\n  // capture native cloneNode before we override it\n\n  var domCloneNode = Node.prototype.cloneNode;\n\n  // exports\n\n  document.registerElement = register;\n  document.createElement = createElement; // override\n  document.createElementNS = createElementNS; // override\n  Node.prototype.cloneNode = cloneNode; // override\n\n  scope.registry = registry;\n\n  /**\n   * Upgrade an element to a custom element. Upgrading an element\n   * causes the custom prototype to be applied, an `is` attribute\n   * to be attached (as needed), and invocation of the `readyCallback`.\n   * `upgrade` does nothing if the element is already upgraded, or\n   * if it matches no registered custom tag name.\n   *\n   * @method ugprade\n   * @param {Element} element The element to upgrade.\n   * @return {Element} The upgraded element.\n   */\n  scope.upgrade = upgradeElement;\n}\n\n// Create a custom 'instanceof'. This is necessary when CustomElements\n// are implemented via a mixin strategy, as for example on IE10.\nvar isInstance;\nif (!Object.__proto__ && !useNative) {\n  isInstance = function(obj, ctor) {\n    var p = obj;\n    while (p) {\n      // NOTE: this is not technically correct since we're not checking if\n      // an object is an instance of a constructor; however, this should\n      // be good enough for the mixin strategy.\n      if (p === ctor.prototype) {\n        return true;\n      }\n      p = p.__proto__;\n    }\n    return false;\n  }\n} else {\n  isInstance = function(obj, base) {\n    return obj instanceof base;\n  }\n}\n\n// exports\nscope.instanceof = isInstance;\nscope.reservedTagList = reservedTagList;\n\n// bc\ndocument.register = document.registerElement;\n\nscope.hasNative = hasNative;\nscope.useNative = useNative;\n\n})(window.CustomElements);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\n// import\n\nvar IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;\n\n// highlander object for parsing a document tree\n\nvar parser = {\n  selectors: [\n    'link[rel=' + IMPORT_LINK_TYPE + ']'\n  ],\n  map: {\n    link: 'parseLink'\n  },\n  parse: function(inDocument) {\n    if (!inDocument.__parsed) {\n      // only parse once\n      inDocument.__parsed = true;\n      // all parsable elements in inDocument (depth-first pre-order traversal)\n      var elts = inDocument.querySelectorAll(parser.selectors);\n      // for each parsable node type, call the mapped parsing method\n      forEach(elts, function(e) {\n        parser[parser.map[e.localName]](e);\n      });\n      // upgrade all upgradeable static elements, anything dynamically\n      // created should be caught by observer\n      CustomElements.upgradeDocument(inDocument);\n      // observe document for dom changes\n      CustomElements.observeDocument(inDocument);\n    }\n  },\n  parseLink: function(linkElt) {\n    // imports\n    if (isDocumentLink(linkElt)) {\n      this.parseImport(linkElt);\n    }\n  },\n  parseImport: function(linkElt) {\n    if (linkElt.import) {\n      parser.parse(linkElt.import);\n    }\n  }\n};\n\nfunction isDocumentLink(inElt) {\n  return (inElt.localName === 'link'\n      && inElt.getAttribute('rel') === IMPORT_LINK_TYPE);\n}\n\nvar forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n\n// exports\n\nscope.parser = parser;\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\n\n})(window.CustomElements);","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope){\n\n// bootstrap parsing\nfunction bootstrap() {\n  // parse document\n  CustomElements.parser.parse(document);\n  // one more pass before register is 'live'\n  CustomElements.upgradeDocument(document);\n  // choose async\n  var async = window.Platform && Platform.endOfMicrotask ? \n    Platform.endOfMicrotask :\n    setTimeout;\n  async(function() {\n    // set internal 'ready' flag, now document.registerElement will trigger \n    // synchronous upgrades\n    CustomElements.ready = true;\n    // capture blunt profiling data\n    CustomElements.readyTime = Date.now();\n    if (window.HTMLImports) {\n      CustomElements.elapsed = CustomElements.readyTime - HTMLImports.readyTime;\n    }\n    // notify the system that we are bootstrapped\n    document.dispatchEvent(\n      new CustomEvent('WebComponentsReady', {bubbles: true})\n    );\n\n    // install upgrade hook if HTMLImports are available\n    if (window.HTMLImports) {\n      HTMLImports.__importsParsingHook = function(elt) {\n        CustomElements.parser.parse(elt.import);\n      }\n    }\n  });\n}\n\n// CustomEvent shim for IE\nif (typeof window.CustomEvent !== 'function') {\n  window.CustomEvent = function(inType) {\n    var e = document.createEvent('HTMLEvents');\n    e.initEvent(inType, true, true);\n    return e;\n  };\n}\n\n// When loading at readyState complete time (or via flag), boot custom elements\n// immediately.\n// If relevant, HTMLImports must already be loaded.\nif (document.readyState === 'complete' || scope.flags.eager) {\n  bootstrap();\n// When loading at readyState interactive time, bootstrap only if HTMLImports\n// are not pending. Also avoid IE as the semantics of this state are unreliable.\n} else if (document.readyState === 'interactive' && !window.attachEvent &&\n    (!window.HTMLImports || window.HTMLImports.ready)) {\n  bootstrap();\n// When loading at other readyStates, wait for the appropriate DOM event to \n// bootstrap.\n} else {\n  var loadEvent = window.HTMLImports && !HTMLImports.ready ?\n      'HTMLImportsLoaded' : 'DOMContentLoaded';\n  window.addEventListener(loadEvent, bootstrap);\n}\n\n})(window.CustomElements);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function() {\n\nif (window.ShadowDOMPolyfill) {\n\n  // ensure wrapped inputs for these functions\n  var fns = ['upgradeAll', 'upgradeSubtree', 'observeDocument',\n      'upgradeDocument'];\n\n  // cache originals\n  var original = {};\n  fns.forEach(function(fn) {\n    original[fn] = CustomElements[fn];\n  });\n\n  // override\n  fns.forEach(function(fn) {\n    CustomElements[fn] = function(inNode) {\n      return original[fn](wrap(inNode));\n    };\n  });\n\n}\n\n})();\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope) {\n  var endOfMicrotask = scope.endOfMicrotask;\n\n  // Generic url loader\n  function Loader(regex) {\n    this.regex = regex;\n  }\n  Loader.prototype = {\n    // TODO(dfreedm): there may be a better factoring here\n    // extract absolute urls from the text (full of relative urls)\n    extractUrls: function(text, base) {\n      var matches = [];\n      var matched, u;\n      while ((matched = this.regex.exec(text))) {\n        u = new URL(matched[1], base);\n        matches.push({matched: matched[0], url: u.href});\n      }\n      return matches;\n    },\n    // take a text blob, a root url, and a callback and load all the urls found within the text\n    // returns a map of absolute url to text\n    process: function(text, root, callback) {\n      var matches = this.extractUrls(text, root);\n      this.fetch(matches, {}, callback);\n    },\n    // build a mapping of url -> text from matches\n    fetch: function(matches, map, callback) {\n      var inflight = matches.length;\n\n      // return early if there is no fetching to be done\n      if (!inflight) {\n        return callback(map);\n      }\n\n      var done = function() {\n        if (--inflight === 0) {\n          callback(map);\n        }\n      };\n\n      // map url -> responseText\n      var handleXhr = function(err, request) {\n        var match = request.match;\n        var key = match.url;\n        // handle errors with an empty string\n        if (err) {\n          map[key] = '';\n          return done();\n        }\n        var response = request.response || request.responseText;\n        map[key] = response;\n        this.fetch(this.extractUrls(response, key), map, done);\n      };\n\n      var m, req, url;\n      for (var i = 0; i < inflight; i++) {\n        m = matches[i];\n        url = m.url;\n        // if this url has already been requested, skip requesting it again\n        if (map[url]) {\n          // Async call to done to simplify the inflight logic\n          endOfMicrotask(done);\n          continue;\n        }\n        req = this.xhr(url, handleXhr, this);\n        req.match = m;\n        // tag the map with an XHR request to deduplicate at the same level\n        map[url] = req;\n      }\n    },\n    xhr: function(url, callback, scope) {\n      var request = new XMLHttpRequest();\n      request.open('GET', url, true);\n      request.send();\n      request.onload = function() {\n        callback.call(scope, null, request);\n      };\n      request.onerror = function() {\n        callback.call(scope, null, request);\n      };\n      return request;\n    }\n  };\n\n  scope.Loader = Loader;\n})(window.Platform);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope) {\n\nvar urlResolver = scope.urlResolver;\nvar Loader = scope.Loader;\n\nfunction StyleResolver() {\n  this.loader = new Loader(this.regex);\n}\nStyleResolver.prototype = {\n  regex: /@import\\s+(?:url)?[\"'\\(]*([^'\"\\)]*)['\"\\)]*;/g,\n  // Recursively replace @imports with the text at that url\n  resolve: function(text, url, callback) {\n    var done = function(map) {\n      callback(this.flatten(text, url, map));\n    }.bind(this);\n    this.loader.process(text, url, done);\n  },\n  // resolve the textContent of a style node\n  resolveNode: function(style, callback) {\n    var text = style.textContent;\n    var url = style.ownerDocument.baseURI;\n    var done = function(text) {\n      style.textContent = text;\n      callback(style);\n    };\n    this.resolve(text, url, done);\n  },\n  // flatten all the @imports to text\n  flatten: function(text, base, map) {\n    var matches = this.loader.extractUrls(text, base);\n    var match, url, intermediate;\n    for (var i = 0; i < matches.length; i++) {\n      match = matches[i];\n      url = match.url;\n      // resolve any css text to be relative to the importer\n      intermediate = urlResolver.resolveCssText(map[url], url);\n      // flatten intermediate @imports\n      intermediate = this.flatten(intermediate, base, map);\n      text = text.replace(match.matched, intermediate);\n    }\n    return text;\n  },\n  loadStyles: function(styles, callback) {\n    var loaded=0, l = styles.length;\n    // called in the context of the style\n    function loadedStyle(style) {\n      loaded++;\n      if (loaded === l && callback) {\n        callback();\n      }\n    }\n    for (var i=0, s; (i<l) && (s=styles[i]); i++) {\n      this.resolveNode(s, loadedStyle);\n    }\n  }\n};\n\nvar styleResolver = new StyleResolver();\n\n// exports\nscope.styleResolver = styleResolver;\n\n})(window.Platform);\n","// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n// Code distributed by Google as part of the polymer project is also\n// subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n\n(function(global) {\n  'use strict';\n\n  var filter = Array.prototype.filter.call.bind(Array.prototype.filter);\n\n  function getTreeScope(node) {\n    while (node.parentNode) {\n      node = node.parentNode;\n    }\n\n    return typeof node.getElementById === 'function' ? node : null;\n  }\n\n  Node.prototype.bind = function(name, observable) {\n    console.error('Unhandled binding to Node: ', this, name, observable);\n  };\n\n  Node.prototype.bindFinished = function() {};\n\n  function updateBindings(node, name, binding) {\n    var bindings = node.bindings_;\n    if (!bindings)\n      bindings = node.bindings_ = {};\n\n    if (bindings[name])\n      binding[name].close();\n\n    return bindings[name] = binding;\n  }\n\n  function returnBinding(node, name, binding) {\n    return binding;\n  }\n\n  function sanitizeValue(value) {\n    return value == null ? '' : value;\n  }\n\n  function updateText(node, value) {\n    node.data = sanitizeValue(value);\n  }\n\n  function textBinding(node) {\n    return function(value) {\n      return updateText(node, value);\n    };\n  }\n\n  var maybeUpdateBindings = returnBinding;\n\n  Object.defineProperty(Platform, 'enableBindingsReflection', {\n    get: function() {\n      return maybeUpdateBindings === updateBindings;\n    },\n    set: function(enable) {\n      maybeUpdateBindings = enable ? updateBindings : returnBinding;\n      return enable;\n    },\n    configurable: true\n  });\n\n  Text.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'textContent')\n      return Node.prototype.bind.call(this, name, value, oneTime);\n\n    if (oneTime)\n      return updateText(this, value);\n\n    var observable = value;\n    updateText(this, observable.open(textBinding(this)));\n    return maybeUpdateBindings(this, name, observable);\n  }\n\n  function updateAttribute(el, name, conditional, value) {\n    if (conditional) {\n      if (value)\n        el.setAttribute(name, '');\n      else\n        el.removeAttribute(name);\n      return;\n    }\n\n    el.setAttribute(name, sanitizeValue(value));\n  }\n\n  function attributeBinding(el, name, conditional) {\n    return function(value) {\n      updateAttribute(el, name, conditional, value);\n    };\n  }\n\n  Element.prototype.bind = function(name, value, oneTime) {\n    var conditional = name[name.length - 1] == '?';\n    if (conditional) {\n      this.removeAttribute(name);\n      name = name.slice(0, -1);\n    }\n\n    if (oneTime)\n      return updateAttribute(this, name, conditional, value);\n\n\n    var observable = value;\n    updateAttribute(this, name, conditional,\n        observable.open(attributeBinding(this, name, conditional)));\n\n    return maybeUpdateBindings(this, name, observable);\n  };\n\n  var checkboxEventType;\n  (function() {\n    // Attempt to feature-detect which event (change or click) is fired first\n    // for checkboxes.\n    var div = document.createElement('div');\n    var checkbox = div.appendChild(document.createElement('input'));\n    checkbox.setAttribute('type', 'checkbox');\n    var first;\n    var count = 0;\n    checkbox.addEventListener('click', function(e) {\n      count++;\n      first = first || 'click';\n    });\n    checkbox.addEventListener('change', function() {\n      count++;\n      first = first || 'change';\n    });\n\n    var event = document.createEvent('MouseEvent');\n    event.initMouseEvent(\"click\", true, true, window, 0, 0, 0, 0, 0, false,\n        false, false, false, 0, null);\n    checkbox.dispatchEvent(event);\n    // WebKit/Blink don't fire the change event if the element is outside the\n    // document, so assume 'change' for that case.\n    checkboxEventType = count == 1 ? 'change' : first;\n  })();\n\n  function getEventForInputType(element) {\n    switch (element.type) {\n      case 'checkbox':\n        return checkboxEventType;\n      case 'radio':\n      case 'select-multiple':\n      case 'select-one':\n        return 'change';\n      case 'range':\n        if (/Trident|MSIE/.test(navigator.userAgent))\n          return 'change';\n      default:\n        return 'input';\n    }\n  }\n\n  function updateInput(input, property, value, santizeFn) {\n    input[property] = (santizeFn || sanitizeValue)(value);\n  }\n\n  function inputBinding(input, property, santizeFn) {\n    return function(value) {\n      return updateInput(input, property, value, santizeFn);\n    }\n  }\n\n  function noop() {}\n\n  function bindInputEvent(input, property, observable, postEventFn) {\n    var eventType = getEventForInputType(input);\n\n    function eventHandler() {\n      observable.setValue(input[property]);\n      observable.discardChanges();\n      (postEventFn || noop)(input);\n      Platform.performMicrotaskCheckpoint();\n    }\n    input.addEventListener(eventType, eventHandler);\n\n    return {\n      close: function() {\n        input.removeEventListener(eventType, eventHandler);\n        observable.close();\n      },\n\n      observable_: observable\n    }\n  }\n\n  function booleanSanitize(value) {\n    return Boolean(value);\n  }\n\n  // |element| is assumed to be an HTMLInputElement with |type| == 'radio'.\n  // Returns an array containing all radio buttons other than |element| that\n  // have the same |name|, either in the form that |element| belongs to or,\n  // if no form, in the document tree to which |element| belongs.\n  //\n  // This implementation is based upon the HTML spec definition of a\n  // \"radio button group\":\n  //   http://www.whatwg.org/specs/web-apps/current-work/multipage/number-state.html#radio-button-group\n  //\n  function getAssociatedRadioButtons(element) {\n    if (element.form) {\n      return filter(element.form.elements, function(el) {\n        return el != element &&\n            el.tagName == 'INPUT' &&\n            el.type == 'radio' &&\n            el.name == element.name;\n      });\n    } else {\n      var treeScope = getTreeScope(element);\n      if (!treeScope)\n        return [];\n      var radios = treeScope.querySelectorAll(\n          'input[type=\"radio\"][name=\"' + element.name + '\"]');\n      return filter(radios, function(el) {\n        return el != element && !el.form;\n      });\n    }\n  }\n\n  function checkedPostEvent(input) {\n    // Only the radio button that is getting checked gets an event. We\n    // therefore find all the associated radio buttons and update their\n    // check binding manually.\n    if (input.tagName === 'INPUT' &&\n        input.type === 'radio') {\n      getAssociatedRadioButtons(input).forEach(function(radio) {\n        var checkedBinding = radio.bindings_.checked;\n        if (checkedBinding) {\n          // Set the value directly to avoid an infinite call stack.\n          checkedBinding.observable_.setValue(false);\n        }\n      });\n    }\n  }\n\n  HTMLInputElement.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'value' && name !== 'checked')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute(name);\n    var sanitizeFn = name == 'checked' ? booleanSanitize : sanitizeValue;\n    var postEventFn = name == 'checked' ? checkedPostEvent : noop;\n\n    if (oneTime)\n      return updateInput(this, name, value, sanitizeFn);\n\n\n    var observable = value;\n    var binding = bindInputEvent(this, name, observable, postEventFn);\n    updateInput(this, name,\n                observable.open(inputBinding(this, name, sanitizeFn)),\n                sanitizeFn);\n\n    // Checkboxes may need to update bindings of other checkboxes.\n    return updateBindings(this, name, binding);\n  }\n\n  HTMLTextAreaElement.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'value')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute('value');\n\n    if (oneTime)\n      return updateInput(this, 'value', value);\n\n    var observable = value;\n    var binding = bindInputEvent(this, 'value', observable);\n    updateInput(this, 'value',\n                observable.open(inputBinding(this, 'value', sanitizeValue)));\n    return maybeUpdateBindings(this, name, binding);\n  }\n\n  function updateOption(option, value) {\n    var parentNode = option.parentNode;;\n    var select;\n    var selectBinding;\n    var oldValue;\n    if (parentNode instanceof HTMLSelectElement &&\n        parentNode.bindings_ &&\n        parentNode.bindings_.value) {\n      select = parentNode;\n      selectBinding = select.bindings_.value;\n      oldValue = select.value;\n    }\n\n    option.value = sanitizeValue(value);\n\n    if (select && select.value != oldValue) {\n      selectBinding.observable_.setValue(select.value);\n      selectBinding.observable_.discardChanges();\n      Platform.performMicrotaskCheckpoint();\n    }\n  }\n\n  function optionBinding(option) {\n    return function(value) {\n      updateOption(option, value);\n    }\n  }\n\n  HTMLOptionElement.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'value')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute('value');\n\n    if (oneTime)\n      return updateOption(this, value);\n\n    var observable = value;\n    var binding = bindInputEvent(this, 'value', observable);\n    updateOption(this, observable.open(optionBinding(this)));\n    return maybeUpdateBindings(this, name, binding);\n  }\n\n  HTMLSelectElement.prototype.bind = function(name, value, oneTime) {\n    if (name === 'selectedindex')\n      name = 'selectedIndex';\n\n    if (name !== 'selectedIndex' && name !== 'value')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute(name);\n\n    if (oneTime)\n      return updateInput(this, name, value);\n\n    var observable = value;\n    var binding = bindInputEvent(this, name, observable);\n    updateInput(this, name,\n                observable.open(inputBinding(this, name)));\n\n    // Option update events may need to access select bindings.\n    return updateBindings(this, name, binding);\n  }\n})(this);\n","// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n// Code distributed by Google as part of the polymer project is also\n// subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n\n(function(global) {\n  'use strict';\n\n  function assert(v) {\n    if (!v)\n      throw new Error('Assertion failed');\n  }\n\n  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n\n  function getFragmentRoot(node) {\n    var p;\n    while (p = node.parentNode) {\n      node = p;\n    }\n\n    return node;\n  }\n\n  function searchRefId(node, id) {\n    if (!id)\n      return;\n\n    var ref;\n    var selector = '#' + id;\n    while (!ref) {\n      node = getFragmentRoot(node);\n\n      if (node.protoContent_)\n        ref = node.protoContent_.querySelector(selector);\n      else if (node.getElementById)\n        ref = node.getElementById(id);\n\n      if (ref || !node.templateCreator_)\n        break\n\n      node = node.templateCreator_;\n    }\n\n    return ref;\n  }\n\n  function getInstanceRoot(node) {\n    while (node.parentNode) {\n      node = node.parentNode;\n    }\n    return node.templateCreator_ ? node : null;\n  }\n\n  var Map;\n  if (global.Map && typeof global.Map.prototype.forEach === 'function') {\n    Map = global.Map;\n  } else {\n    Map = function() {\n      this.keys = [];\n      this.values = [];\n    };\n\n    Map.prototype = {\n      set: function(key, value) {\n        var index = this.keys.indexOf(key);\n        if (index < 0) {\n          this.keys.push(key);\n          this.values.push(value);\n        } else {\n          this.values[index] = value;\n        }\n      },\n\n      get: function(key) {\n        var index = this.keys.indexOf(key);\n        if (index < 0)\n          return;\n\n        return this.values[index];\n      },\n\n      delete: function(key, value) {\n        var index = this.keys.indexOf(key);\n        if (index < 0)\n          return false;\n\n        this.keys.splice(index, 1);\n        this.values.splice(index, 1);\n        return true;\n      },\n\n      forEach: function(f, opt_this) {\n        for (var i = 0; i < this.keys.length; i++)\n          f.call(opt_this || this, this.values[i], this.keys[i], this);\n      }\n    };\n  }\n\n  // JScript does not have __proto__. We wrap all object literals with\n  // createObject which uses Object.create, Object.defineProperty and\n  // Object.getOwnPropertyDescriptor to create a new object that does the exact\n  // same thing. The main downside to this solution is that we have to extract\n  // all those property descriptors for IE.\n  var createObject = ('__proto__' in {}) ?\n      function(obj) { return obj; } :\n      function(obj) {\n        var proto = obj.__proto__;\n        if (!proto)\n          return obj;\n        var newObject = Object.create(proto);\n        Object.getOwnPropertyNames(obj).forEach(function(name) {\n          Object.defineProperty(newObject, name,\n                               Object.getOwnPropertyDescriptor(obj, name));\n        });\n        return newObject;\n      };\n\n  // IE does not support have Document.prototype.contains.\n  if (typeof document.contains != 'function') {\n    Document.prototype.contains = function(node) {\n      if (node === this || node.parentNode === this)\n        return true;\n      return this.documentElement.contains(node);\n    }\n  }\n\n  var BIND = 'bind';\n  var REPEAT = 'repeat';\n  var IF = 'if';\n\n  var templateAttributeDirectives = {\n    'template': true,\n    'repeat': true,\n    'bind': true,\n    'ref': true\n  };\n\n  var semanticTemplateElements = {\n    'THEAD': true,\n    'TBODY': true,\n    'TFOOT': true,\n    'TH': true,\n    'TR': true,\n    'TD': true,\n    'COLGROUP': true,\n    'COL': true,\n    'CAPTION': true,\n    'OPTION': true,\n    'OPTGROUP': true\n  };\n\n  var hasTemplateElement = typeof HTMLTemplateElement !== 'undefined';\n  if (hasTemplateElement) {\n    // TODO(rafaelw): Remove when fix for\n    // https://codereview.chromium.org/164803002/\n    // makes it to Chrome release.\n    (function() {\n      var t = document.createElement('template');\n      var d = t.content.ownerDocument;\n      var html = d.appendChild(d.createElement('html'));\n      var head = html.appendChild(d.createElement('head'));\n      var base = d.createElement('base');\n      base.href = document.baseURI;\n      head.appendChild(base);\n    })();\n  }\n\n  var allTemplatesSelectors = 'template, ' +\n      Object.keys(semanticTemplateElements).map(function(tagName) {\n        return tagName.toLowerCase() + '[template]';\n      }).join(', ');\n\n  function isSVGTemplate(el) {\n    return el.tagName == 'template' &&\n           el.namespaceURI == 'http://www.w3.org/2000/svg';\n  }\n\n  function isHTMLTemplate(el) {\n    return el.tagName == 'TEMPLATE' &&\n           el.namespaceURI == 'http://www.w3.org/1999/xhtml';\n  }\n\n  function isAttributeTemplate(el) {\n    return Boolean(semanticTemplateElements[el.tagName] &&\n                   el.hasAttribute('template'));\n  }\n\n  function isTemplate(el) {\n    if (el.isTemplate_ === undefined)\n      el.isTemplate_ = el.tagName == 'TEMPLATE' || isAttributeTemplate(el);\n\n    return el.isTemplate_;\n  }\n\n  // FIXME: Observe templates being added/removed from documents\n  // FIXME: Expose imperative API to decorate and observe templates in\n  // \"disconnected tress\" (e.g. ShadowRoot)\n  document.addEventListener('DOMContentLoaded', function(e) {\n    bootstrapTemplatesRecursivelyFrom(document);\n    // FIXME: Is this needed? Seems like it shouldn't be.\n    Platform.performMicrotaskCheckpoint();\n  }, false);\n\n  function forAllTemplatesFrom(node, fn) {\n    var subTemplates = node.querySelectorAll(allTemplatesSelectors);\n\n    if (isTemplate(node))\n      fn(node)\n    forEach(subTemplates, fn);\n  }\n\n  function bootstrapTemplatesRecursivelyFrom(node) {\n    function bootstrap(template) {\n      if (!HTMLTemplateElement.decorate(template))\n        bootstrapTemplatesRecursivelyFrom(template.content);\n    }\n\n    forAllTemplatesFrom(node, bootstrap);\n  }\n\n  if (!hasTemplateElement) {\n    /**\n     * This represents a <template> element.\n     * @constructor\n     * @extends {HTMLElement}\n     */\n    global.HTMLTemplateElement = function() {\n      throw TypeError('Illegal constructor');\n    };\n  }\n\n  var hasProto = '__proto__' in {};\n\n  function mixin(to, from) {\n    Object.getOwnPropertyNames(from).forEach(function(name) {\n      Object.defineProperty(to, name,\n                            Object.getOwnPropertyDescriptor(from, name));\n    });\n  }\n\n  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/templates/index.html#dfn-template-contents-owner\n  function getOrCreateTemplateContentsOwner(template) {\n    var doc = template.ownerDocument\n    if (!doc.defaultView)\n      return doc;\n    var d = doc.templateContentsOwner_;\n    if (!d) {\n      // TODO(arv): This should either be a Document or HTMLDocument depending\n      // on doc.\n      d = doc.implementation.createHTMLDocument('');\n      while (d.lastChild) {\n        d.removeChild(d.lastChild);\n      }\n      doc.templateContentsOwner_ = d;\n    }\n    return d;\n  }\n\n  function getTemplateStagingDocument(template) {\n    if (!template.stagingDocument_) {\n      var owner = template.ownerDocument;\n      if (!owner.stagingDocument_) {\n        owner.stagingDocument_ = owner.implementation.createHTMLDocument('');\n        owner.stagingDocument_.isStagingDocument = true;\n        // TODO(rafaelw): Remove when fix for\n        // https://codereview.chromium.org/164803002/\n        // makes it to Chrome release.\n        var base = owner.stagingDocument_.createElement('base');\n        base.href = document.baseURI;\n        owner.stagingDocument_.head.appendChild(base);\n\n        owner.stagingDocument_.stagingDocument_ = owner.stagingDocument_;\n      }\n\n      template.stagingDocument_ = owner.stagingDocument_;\n    }\n\n    return template.stagingDocument_;\n  }\n\n  // For non-template browsers, the parser will disallow <template> in certain\n  // locations, so we allow \"attribute templates\" which combine the template\n  // element with the top-level container node of the content, e.g.\n  //\n  //   <tr template repeat=\"{{ foo }}\"\" class=\"bar\"><td>Bar</td></tr>\n  //\n  // becomes\n  //\n  //   <template repeat=\"{{ foo }}\">\n  //   + #document-fragment\n  //     + <tr class=\"bar\">\n  //       + <td>Bar</td>\n  //\n  function extractTemplateFromAttributeTemplate(el) {\n    var template = el.ownerDocument.createElement('template');\n    el.parentNode.insertBefore(template, el);\n\n    var attribs = el.attributes;\n    var count = attribs.length;\n    while (count-- > 0) {\n      var attrib = attribs[count];\n      if (templateAttributeDirectives[attrib.name]) {\n        if (attrib.name !== 'template')\n          template.setAttribute(attrib.name, attrib.value);\n        el.removeAttribute(attrib.name);\n      }\n    }\n\n    return template;\n  }\n\n  function extractTemplateFromSVGTemplate(el) {\n    var template = el.ownerDocument.createElement('template');\n    el.parentNode.insertBefore(template, el);\n\n    var attribs = el.attributes;\n    var count = attribs.length;\n    while (count-- > 0) {\n      var attrib = attribs[count];\n      template.setAttribute(attrib.name, attrib.value);\n      el.removeAttribute(attrib.name);\n    }\n\n    el.parentNode.removeChild(el);\n    return template;\n  }\n\n  function liftNonNativeTemplateChildrenIntoContent(template, el, useRoot) {\n    var content = template.content;\n    if (useRoot) {\n      content.appendChild(el);\n      return;\n    }\n\n    var child;\n    while (child = el.firstChild) {\n      content.appendChild(child);\n    }\n  }\n\n  var templateObserver;\n  if (typeof MutationObserver == 'function') {\n    templateObserver = new MutationObserver(function(records) {\n      for (var i = 0; i < records.length; i++) {\n        records[i].target.refChanged_();\n      }\n    });\n  }\n\n  /**\n   * Ensures proper API and content model for template elements.\n   * @param {HTMLTemplateElement} opt_instanceRef The template element which\n   *     |el| template element will return as the value of its ref(), and whose\n   *     content will be used as source when createInstance() is invoked.\n   */\n  HTMLTemplateElement.decorate = function(el, opt_instanceRef) {\n    if (el.templateIsDecorated_)\n      return false;\n\n    var templateElement = el;\n    templateElement.templateIsDecorated_ = true;\n\n    var isNativeHTMLTemplate = isHTMLTemplate(templateElement) &&\n                               hasTemplateElement;\n    var bootstrapContents = isNativeHTMLTemplate;\n    var liftContents = !isNativeHTMLTemplate;\n    var liftRoot = false;\n\n    if (!isNativeHTMLTemplate) {\n      if (isAttributeTemplate(templateElement)) {\n        assert(!opt_instanceRef);\n        templateElement = extractTemplateFromAttributeTemplate(el);\n        templateElement.templateIsDecorated_ = true;\n        isNativeHTMLTemplate = hasTemplateElement;\n        liftRoot = true;\n      } else if (isSVGTemplate(templateElement)) {\n        templateElement = extractTemplateFromSVGTemplate(el);\n        templateElement.templateIsDecorated_ = true;\n        isNativeHTMLTemplate = hasTemplateElement;\n      }\n    }\n\n    if (!isNativeHTMLTemplate) {\n      fixTemplateElementPrototype(templateElement);\n      var doc = getOrCreateTemplateContentsOwner(templateElement);\n      templateElement.content_ = doc.createDocumentFragment();\n    }\n\n    if (opt_instanceRef) {\n      // template is contained within an instance, its direct content must be\n      // empty\n      templateElement.instanceRef_ = opt_instanceRef;\n    } else if (liftContents) {\n      liftNonNativeTemplateChildrenIntoContent(templateElement,\n                                               el,\n                                               liftRoot);\n    } else if (bootstrapContents) {\n      bootstrapTemplatesRecursivelyFrom(templateElement.content);\n    }\n\n    return true;\n  };\n\n  // TODO(rafaelw): This used to decorate recursively all templates from a given\n  // node. This happens by default on 'DOMContentLoaded', but may be needed\n  // in subtrees not descendent from document (e.g. ShadowRoot).\n  // Review whether this is the right public API.\n  HTMLTemplateElement.bootstrap = bootstrapTemplatesRecursivelyFrom;\n\n  var htmlElement = global.HTMLUnknownElement || HTMLElement;\n\n  var contentDescriptor = {\n    get: function() {\n      return this.content_;\n    },\n    enumerable: true,\n    configurable: true\n  };\n\n  if (!hasTemplateElement) {\n    // Gecko is more picky with the prototype than WebKit. Make sure to use the\n    // same prototype as created in the constructor.\n    HTMLTemplateElement.prototype = Object.create(htmlElement.prototype);\n\n    Object.defineProperty(HTMLTemplateElement.prototype, 'content',\n                          contentDescriptor);\n  }\n\n  function fixTemplateElementPrototype(el) {\n    if (hasProto)\n      el.__proto__ = HTMLTemplateElement.prototype;\n    else\n      mixin(el, HTMLTemplateElement.prototype);\n  }\n\n  function ensureSetModelScheduled(template) {\n    if (!template.setModelFn_) {\n      template.setModelFn_ = function() {\n        template.setModelFnScheduled_ = false;\n        var map = getBindings(template,\n            template.delegate_ && template.delegate_.prepareBinding);\n        processBindings(template, map, template.model_);\n      };\n    }\n\n    if (!template.setModelFnScheduled_) {\n      template.setModelFnScheduled_ = true;\n      Observer.runEOM_(template.setModelFn_);\n    }\n  }\n\n  mixin(HTMLTemplateElement.prototype, {\n    bind: function(name, value, oneTime) {\n      if (name != 'ref')\n        return Element.prototype.bind.call(this, name, value, oneTime);\n\n      var self = this;\n      var ref = oneTime ? value : value.open(function(ref) {\n        self.setAttribute('ref', ref);\n        self.refChanged_();\n      });\n\n      this.setAttribute('ref', ref);\n      this.refChanged_();\n      if (oneTime)\n        return;\n\n      if (!this.bindings_) {\n        this.bindings_ = { ref: value };\n      } else {\n        this.bindings_.ref = value;\n      }\n\n      return value;\n    },\n\n    processBindingDirectives_: function(directives) {\n      if (this.iterator_)\n        this.iterator_.closeDeps();\n\n      if (!directives.if && !directives.bind && !directives.repeat) {\n        if (this.iterator_) {\n          this.iterator_.close();\n          this.iterator_ = undefined;\n        }\n\n        return;\n      }\n\n      if (!this.iterator_) {\n        this.iterator_ = new TemplateIterator(this);\n      }\n\n      this.iterator_.updateDependencies(directives, this.model_);\n\n      if (templateObserver) {\n        templateObserver.observe(this, { attributes: true,\n                                         attributeFilter: ['ref'] });\n      }\n\n      return this.iterator_;\n    },\n\n    createInstance: function(model, bindingDelegate, delegate_) {\n      if (bindingDelegate)\n        delegate_ = this.newDelegate_(bindingDelegate);\n      else if (!delegate_)\n        delegate_ = this.delegate_;\n\n      if (!this.refContent_)\n        this.refContent_ = this.ref_.content;\n      var content = this.refContent_;\n      if (content.firstChild === null)\n        return emptyInstance;\n\n      var map = getInstanceBindingMap(content, delegate_);\n      var stagingDocument = getTemplateStagingDocument(this);\n      var instance = stagingDocument.createDocumentFragment();\n      instance.templateCreator_ = this;\n      instance.protoContent_ = content;\n      instance.bindings_ = [];\n      instance.terminator_ = null;\n      var instanceRecord = instance.templateInstance_ = {\n        firstNode: null,\n        lastNode: null,\n        model: model\n      };\n\n      var i = 0;\n      var collectTerminator = false;\n      for (var child = content.firstChild; child; child = child.nextSibling) {\n        // The terminator of the instance is the clone of the last child of the\n        // content. If the last child is an active template, it may produce\n        // instances as a result of production, so simply collecting the last\n        // child of the instance after it has finished producing may be wrong.\n        if (child.nextSibling === null)\n          collectTerminator = true;\n\n        var clone = cloneAndBindInstance(child, instance, stagingDocument,\n                                         map.children[i++],\n                                         model,\n                                         delegate_,\n                                         instance.bindings_);\n        clone.templateInstance_ = instanceRecord;\n        if (collectTerminator)\n          instance.terminator_ = clone;\n      }\n\n      instanceRecord.firstNode = instance.firstChild;\n      instanceRecord.lastNode = instance.lastChild;\n      instance.templateCreator_ = undefined;\n      instance.protoContent_ = undefined;\n      return instance;\n    },\n\n    get model() {\n      return this.model_;\n    },\n\n    set model(model) {\n      this.model_ = model;\n      ensureSetModelScheduled(this);\n    },\n\n    get bindingDelegate() {\n      return this.delegate_ && this.delegate_.raw;\n    },\n\n    refChanged_: function() {\n      if (!this.iterator_ || this.refContent_ === this.ref_.content)\n        return;\n\n      this.refContent_ = undefined;\n      this.iterator_.valueChanged();\n      this.iterator_.updateIteratedValue();\n    },\n\n    clear: function() {\n      this.model_ = undefined;\n      this.delegate_ = undefined;\n      if (this.bindings_ && this.bindings_.ref)\n        this.bindings_.ref.close()\n      this.refContent_ = undefined;\n      if (!this.iterator_)\n        return;\n      this.iterator_.valueChanged();\n      this.iterator_.close()\n      this.iterator_ = undefined;\n    },\n\n    setDelegate_: function(delegate) {\n      this.delegate_ = delegate;\n      this.bindingMap_ = undefined;\n      if (this.iterator_) {\n        this.iterator_.instancePositionChangedFn_ = undefined;\n        this.iterator_.instanceModelFn_ = undefined;\n      }\n    },\n\n    newDelegate_: function(bindingDelegate) {\n      if (!bindingDelegate)\n        return;\n\n      function delegateFn(name) {\n        var fn = bindingDelegate && bindingDelegate[name];\n        if (typeof fn != 'function')\n          return;\n\n        return function() {\n          return fn.apply(bindingDelegate, arguments);\n        };\n      }\n\n      return {\n        bindingMaps: {},\n        raw: bindingDelegate,\n        prepareBinding: delegateFn('prepareBinding'),\n        prepareInstanceModel: delegateFn('prepareInstanceModel'),\n        prepareInstancePositionChanged:\n            delegateFn('prepareInstancePositionChanged')\n      };\n    },\n\n    // TODO(rafaelw): Assigning .bindingDelegate always succeeds. It may\n    // make sense to issue a warning or even throw if the template is already\n    // \"activated\", since this would be a strange thing to do.\n    set bindingDelegate(bindingDelegate) {\n      if (this.delegate_) {\n        throw Error('Template must be cleared before a new bindingDelegate ' +\n                    'can be assigned');\n      }\n\n      this.setDelegate_(this.newDelegate_(bindingDelegate));\n    },\n\n    get ref_() {\n      var ref = searchRefId(this, this.getAttribute('ref'));\n      if (!ref)\n        ref = this.instanceRef_;\n\n      if (!ref)\n        return this;\n\n      var nextRef = ref.ref_;\n      return nextRef ? nextRef : ref;\n    }\n  });\n\n  // Returns\n  //   a) undefined if there are no mustaches.\n  //   b) [TEXT, (ONE_TIME?, PATH, DELEGATE_FN, TEXT)+] if there is at least one mustache.\n  function parseMustaches(s, name, node, prepareBindingFn) {\n    if (!s || !s.length)\n      return;\n\n    var tokens;\n    var length = s.length;\n    var startIndex = 0, lastIndex = 0, endIndex = 0;\n    var onlyOneTime = true;\n    while (lastIndex < length) {\n      var startIndex = s.indexOf('{{', lastIndex);\n      var oneTimeStart = s.indexOf('[[', lastIndex);\n      var oneTime = false;\n      var terminator = '}}';\n\n      if (oneTimeStart >= 0 &&\n          (startIndex < 0 || oneTimeStart < startIndex)) {\n        startIndex = oneTimeStart;\n        oneTime = true;\n        terminator = ']]';\n      }\n\n      endIndex = startIndex < 0 ? -1 : s.indexOf(terminator, startIndex + 2);\n\n      if (endIndex < 0) {\n        if (!tokens)\n          return;\n\n        tokens.push(s.slice(lastIndex)); // TEXT\n        break;\n      }\n\n      tokens = tokens || [];\n      tokens.push(s.slice(lastIndex, startIndex)); // TEXT\n      var pathString = s.slice(startIndex + 2, endIndex).trim();\n      tokens.push(oneTime); // ONE_TIME?\n      onlyOneTime = onlyOneTime && oneTime;\n      var delegateFn = prepareBindingFn &&\n                       prepareBindingFn(pathString, name, node);\n      // Don't try to parse the expression if there's a prepareBinding function\n      if (delegateFn == null) {\n        tokens.push(Path.get(pathString)); // PATH\n      } else {\n        tokens.push(null);\n      }\n      tokens.push(delegateFn); // DELEGATE_FN\n      lastIndex = endIndex + 2;\n    }\n\n    if (lastIndex === length)\n      tokens.push(''); // TEXT\n\n    tokens.hasOnePath = tokens.length === 5;\n    tokens.isSimplePath = tokens.hasOnePath &&\n                          tokens[0] == '' &&\n                          tokens[4] == '';\n    tokens.onlyOneTime = onlyOneTime;\n\n    tokens.combinator = function(values) {\n      var newValue = tokens[0];\n\n      for (var i = 1; i < tokens.length; i += 4) {\n        var value = tokens.hasOnePath ? values : values[(i - 1) / 4];\n        if (value !== undefined)\n          newValue += value;\n        newValue += tokens[i + 3];\n      }\n\n      return newValue;\n    }\n\n    return tokens;\n  };\n\n  function processOneTimeBinding(name, tokens, node, model) {\n    if (tokens.hasOnePath) {\n      var delegateFn = tokens[3];\n      var value = delegateFn ? delegateFn(model, node, true) :\n                               tokens[2].getValueFrom(model);\n      return tokens.isSimplePath ? value : tokens.combinator(value);\n    }\n\n    var values = [];\n    for (var i = 1; i < tokens.length; i += 4) {\n      var delegateFn = tokens[i + 2];\n      values[(i - 1) / 4] = delegateFn ? delegateFn(model, node) :\n          tokens[i + 1].getValueFrom(model);\n    }\n\n    return tokens.combinator(values);\n  }\n\n  function processSinglePathBinding(name, tokens, node, model) {\n    var delegateFn = tokens[3];\n    var observer = delegateFn ? delegateFn(model, node, false) :\n        new PathObserver(model, tokens[2]);\n\n    return tokens.isSimplePath ? observer :\n        new ObserverTransform(observer, tokens.combinator);\n  }\n\n  function processBinding(name, tokens, node, model) {\n    if (tokens.onlyOneTime)\n      return processOneTimeBinding(name, tokens, node, model);\n\n    if (tokens.hasOnePath)\n      return processSinglePathBinding(name, tokens, node, model);\n\n    var observer = new CompoundObserver();\n\n    for (var i = 1; i < tokens.length; i += 4) {\n      var oneTime = tokens[i];\n      var delegateFn = tokens[i + 2];\n\n      if (delegateFn) {\n        var value = delegateFn(model, node, oneTime);\n        if (oneTime)\n          observer.addPath(value)\n        else\n          observer.addObserver(value);\n        continue;\n      }\n\n      var path = tokens[i + 1];\n      if (oneTime)\n        observer.addPath(path.getValueFrom(model))\n      else\n        observer.addPath(model, path);\n    }\n\n    return new ObserverTransform(observer, tokens.combinator);\n  }\n\n  function processBindings(node, bindings, model, instanceBindings) {\n    for (var i = 0; i < bindings.length; i += 2) {\n      var name = bindings[i]\n      var tokens = bindings[i + 1];\n      var value = processBinding(name, tokens, node, model);\n      var binding = node.bind(name, value, tokens.onlyOneTime);\n      if (binding && instanceBindings)\n        instanceBindings.push(binding);\n    }\n\n    node.bindFinished();\n    if (!bindings.isTemplate)\n      return;\n\n    node.model_ = model;\n    var iter = node.processBindingDirectives_(bindings);\n    if (instanceBindings && iter)\n      instanceBindings.push(iter);\n  }\n\n  function parseWithDefault(el, name, prepareBindingFn) {\n    var v = el.getAttribute(name);\n    return parseMustaches(v == '' ? '{{}}' : v, name, el, prepareBindingFn);\n  }\n\n  function parseAttributeBindings(element, prepareBindingFn) {\n    assert(element);\n\n    var bindings = [];\n    var ifFound = false;\n    var bindFound = false;\n\n    for (var i = 0; i < element.attributes.length; i++) {\n      var attr = element.attributes[i];\n      var name = attr.name;\n      var value = attr.value;\n\n      // Allow bindings expressed in attributes to be prefixed with underbars.\n      // We do this to allow correct semantics for browsers that don't implement\n      // <template> where certain attributes might trigger side-effects -- and\n      // for IE which sanitizes certain attributes, disallowing mustache\n      // replacements in their text.\n      while (name[0] === '_') {\n        name = name.substring(1);\n      }\n\n      if (isTemplate(element) &&\n          (name === IF || name === BIND || name === REPEAT)) {\n        continue;\n      }\n\n      var tokens = parseMustaches(value, name, element,\n                                  prepareBindingFn);\n      if (!tokens)\n        continue;\n\n      bindings.push(name, tokens);\n    }\n\n    if (isTemplate(element)) {\n      bindings.isTemplate = true;\n      bindings.if = parseWithDefault(element, IF, prepareBindingFn);\n      bindings.bind = parseWithDefault(element, BIND, prepareBindingFn);\n      bindings.repeat = parseWithDefault(element, REPEAT, prepareBindingFn);\n\n      if (bindings.if && !bindings.bind && !bindings.repeat)\n        bindings.bind = parseMustaches('{{}}', BIND, element, prepareBindingFn);\n    }\n\n    return bindings;\n  }\n\n  function getBindings(node, prepareBindingFn) {\n    if (node.nodeType === Node.ELEMENT_NODE)\n      return parseAttributeBindings(node, prepareBindingFn);\n\n    if (node.nodeType === Node.TEXT_NODE) {\n      var tokens = parseMustaches(node.data, 'textContent', node,\n                                  prepareBindingFn);\n      if (tokens)\n        return ['textContent', tokens];\n    }\n\n    return [];\n  }\n\n  function cloneAndBindInstance(node, parent, stagingDocument, bindings, model,\n                                delegate,\n                                instanceBindings,\n                                instanceRecord) {\n    var clone = parent.appendChild(stagingDocument.importNode(node, false));\n\n    var i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      cloneAndBindInstance(child, clone, stagingDocument,\n                            bindings.children[i++],\n                            model,\n                            delegate,\n                            instanceBindings);\n    }\n\n    if (bindings.isTemplate) {\n      HTMLTemplateElement.decorate(clone, node);\n      if (delegate)\n        clone.setDelegate_(delegate);\n    }\n\n    processBindings(clone, bindings, model, instanceBindings);\n    return clone;\n  }\n\n  function createInstanceBindingMap(node, prepareBindingFn) {\n    var map = getBindings(node, prepareBindingFn);\n    map.children = {};\n    var index = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      map.children[index++] = createInstanceBindingMap(child, prepareBindingFn);\n    }\n\n    return map;\n  }\n\n  var contentUidCounter = 1;\n\n  // TODO(rafaelw): Setup a MutationObserver on content which clears the id\n  // so that bindingMaps regenerate when the template.content changes.\n  function getContentUid(content) {\n    var id = content.id_;\n    if (!id)\n      id = content.id_ = contentUidCounter++;\n    return id;\n  }\n\n  // Each delegate is associated with a set of bindingMaps, one for each\n  // content which may be used by a template. The intent is that each binding\n  // delegate gets the opportunity to prepare the instance (via the prepare*\n  // delegate calls) once across all uses.\n  // TODO(rafaelw): Separate out the parse map from the binding map. In the\n  // current implementation, if two delegates need a binding map for the same\n  // content, the second will have to reparse.\n  function getInstanceBindingMap(content, delegate_) {\n    var contentId = getContentUid(content);\n    if (delegate_) {\n      var map = delegate_.bindingMaps[contentId];\n      if (!map) {\n        map = delegate_.bindingMaps[contentId] =\n            createInstanceBindingMap(content, delegate_.prepareBinding) || [];\n      }\n      return map;\n    }\n\n    var map = content.bindingMap_;\n    if (!map) {\n      map = content.bindingMap_ =\n          createInstanceBindingMap(content, undefined) || [];\n    }\n    return map;\n  }\n\n  Object.defineProperty(Node.prototype, 'templateInstance', {\n    get: function() {\n      var instance = this.templateInstance_;\n      return instance ? instance :\n          (this.parentNode ? this.parentNode.templateInstance : undefined);\n    }\n  });\n\n  var emptyInstance = document.createDocumentFragment();\n  emptyInstance.bindings_ = [];\n  emptyInstance.terminator_ = null;\n\n  function TemplateIterator(templateElement) {\n    this.closed = false;\n    this.templateElement_ = templateElement;\n    this.instances = [];\n    this.deps = undefined;\n    this.iteratedValue = [];\n    this.presentValue = undefined;\n    this.arrayObserver = undefined;\n  }\n\n  TemplateIterator.prototype = {\n    closeDeps: function() {\n      var deps = this.deps;\n      if (deps) {\n        if (deps.ifOneTime === false)\n          deps.ifValue.close();\n        if (deps.oneTime === false)\n          deps.value.close();\n      }\n    },\n\n    updateDependencies: function(directives, model) {\n      this.closeDeps();\n\n      var deps = this.deps = {};\n      var template = this.templateElement_;\n\n      if (directives.if) {\n        deps.hasIf = true;\n        deps.ifOneTime = directives.if.onlyOneTime;\n        deps.ifValue = processBinding(IF, directives.if, template, model);\n\n        // oneTime if & predicate is false. nothing else to do.\n        if (deps.ifOneTime && !deps.ifValue) {\n          this.updateIteratedValue();\n          return;\n        }\n\n        if (!deps.ifOneTime)\n          deps.ifValue.open(this.updateIteratedValue, this);\n      }\n\n      if (directives.repeat) {\n        deps.repeat = true;\n        deps.oneTime = directives.repeat.onlyOneTime;\n        deps.value = processBinding(REPEAT, directives.repeat, template, model);\n      } else {\n        deps.repeat = false;\n        deps.oneTime = directives.bind.onlyOneTime;\n        deps.value = processBinding(BIND, directives.bind, template, model);\n      }\n\n      if (!deps.oneTime)\n        deps.value.open(this.updateIteratedValue, this);\n\n      this.updateIteratedValue();\n    },\n\n    updateIteratedValue: function() {\n      if (this.deps.hasIf) {\n        var ifValue = this.deps.ifValue;\n        if (!this.deps.ifOneTime)\n          ifValue = ifValue.discardChanges();\n        if (!ifValue) {\n          this.valueChanged();\n          return;\n        }\n      }\n\n      var value = this.deps.value;\n      if (!this.deps.oneTime)\n        value = value.discardChanges();\n      if (!this.deps.repeat)\n        value = [value];\n      var observe = this.deps.repeat &&\n                    !this.deps.oneTime &&\n                    Array.isArray(value);\n      this.valueChanged(value, observe);\n    },\n\n    valueChanged: function(value, observeValue) {\n      if (!Array.isArray(value))\n        value = [];\n\n      if (value === this.iteratedValue)\n        return;\n\n      this.unobserve();\n      this.presentValue = value;\n      if (observeValue) {\n        this.arrayObserver = new ArrayObserver(this.presentValue);\n        this.arrayObserver.open(this.handleSplices, this);\n      }\n\n      this.handleSplices(ArrayObserver.calculateSplices(this.presentValue,\n                                                        this.iteratedValue));\n    },\n\n    getLastInstanceNode: function(index) {\n      if (index == -1)\n        return this.templateElement_;\n      var instance = this.instances[index];\n      var terminator = instance.terminator_;\n      if (!terminator)\n        return this.getLastInstanceNode(index - 1);\n\n      if (terminator.nodeType !== Node.ELEMENT_NODE ||\n          this.templateElement_ === terminator) {\n        return terminator;\n      }\n\n      var subtemplateIterator = terminator.iterator_;\n      if (!subtemplateIterator)\n        return terminator;\n\n      return subtemplateIterator.getLastTemplateNode();\n    },\n\n    getLastTemplateNode: function() {\n      return this.getLastInstanceNode(this.instances.length - 1);\n    },\n\n    insertInstanceAt: function(index, fragment) {\n      var previousInstanceLast = this.getLastInstanceNode(index - 1);\n      var parent = this.templateElement_.parentNode;\n      this.instances.splice(index, 0, fragment);\n\n      parent.insertBefore(fragment, previousInstanceLast.nextSibling);\n    },\n\n    extractInstanceAt: function(index) {\n      var previousInstanceLast = this.getLastInstanceNode(index - 1);\n      var lastNode = this.getLastInstanceNode(index);\n      var parent = this.templateElement_.parentNode;\n      var instance = this.instances.splice(index, 1)[0];\n\n      while (lastNode !== previousInstanceLast) {\n        var node = previousInstanceLast.nextSibling;\n        if (node == lastNode)\n          lastNode = previousInstanceLast;\n\n        instance.appendChild(parent.removeChild(node));\n      }\n\n      return instance;\n    },\n\n    getDelegateFn: function(fn) {\n      fn = fn && fn(this.templateElement_);\n      return typeof fn === 'function' ? fn : null;\n    },\n\n    handleSplices: function(splices) {\n      if (this.closed || !splices.length)\n        return;\n\n      var template = this.templateElement_;\n\n      if (!template.parentNode) {\n        this.close();\n        return;\n      }\n\n      ArrayObserver.applySplices(this.iteratedValue, this.presentValue,\n                                 splices);\n\n      var delegate = template.delegate_;\n      if (this.instanceModelFn_ === undefined) {\n        this.instanceModelFn_ =\n            this.getDelegateFn(delegate && delegate.prepareInstanceModel);\n      }\n\n      if (this.instancePositionChangedFn_ === undefined) {\n        this.instancePositionChangedFn_ =\n            this.getDelegateFn(delegate &&\n                               delegate.prepareInstancePositionChanged);\n      }\n\n      // Instance Removals\n      var instanceCache = new Map;\n      var removeDelta = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        var removed = splice.removed;\n        for (var j = 0; j < removed.length; j++) {\n          var model = removed[j];\n          var instance = this.extractInstanceAt(splice.index + removeDelta);\n          if (instance !== emptyInstance) {\n            instanceCache.set(model, instance);\n          }\n        }\n\n        removeDelta -= splice.addedCount;\n      }\n\n      // Instance Insertions\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        var addIndex = splice.index;\n        for (; addIndex < splice.index + splice.addedCount; addIndex++) {\n          var model = this.iteratedValue[addIndex];\n          var instance = instanceCache.get(model);\n          if (instance) {\n            instanceCache.delete(model);\n          } else {\n            if (this.instanceModelFn_) {\n              model = this.instanceModelFn_(model);\n            }\n\n            if (model === undefined) {\n              instance = emptyInstance;\n            } else {\n              instance = template.createInstance(model, undefined, delegate);\n            }\n          }\n\n          this.insertInstanceAt(addIndex, instance);\n        }\n      }\n\n      instanceCache.forEach(function(instance) {\n        this.closeInstanceBindings(instance);\n      }, this);\n\n      if (this.instancePositionChangedFn_)\n        this.reportInstancesMoved(splices);\n    },\n\n    reportInstanceMoved: function(index) {\n      var instance = this.instances[index];\n      if (instance === emptyInstance)\n        return;\n\n      this.instancePositionChangedFn_(instance.templateInstance_, index);\n    },\n\n    reportInstancesMoved: function(splices) {\n      var index = 0;\n      var offset = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        if (offset != 0) {\n          while (index < splice.index) {\n            this.reportInstanceMoved(index);\n            index++;\n          }\n        } else {\n          index = splice.index;\n        }\n\n        while (index < splice.index + splice.addedCount) {\n          this.reportInstanceMoved(index);\n          index++;\n        }\n\n        offset += splice.addedCount - splice.removed.length;\n      }\n\n      if (offset == 0)\n        return;\n\n      var length = this.instances.length;\n      while (index < length) {\n        this.reportInstanceMoved(index);\n        index++;\n      }\n    },\n\n    closeInstanceBindings: function(instance) {\n      var bindings = instance.bindings_;\n      for (var i = 0; i < bindings.length; i++) {\n        bindings[i].close();\n      }\n    },\n\n    unobserve: function() {\n      if (!this.arrayObserver)\n        return;\n\n      this.arrayObserver.close();\n      this.arrayObserver = undefined;\n    },\n\n    close: function() {\n      if (this.closed)\n        return;\n      this.unobserve();\n      for (var i = 0; i < this.instances.length; i++) {\n        this.closeInstanceBindings(this.instances[i]);\n      }\n\n      this.instances.length = 0;\n      this.closeDeps();\n      this.templateElement_.iterator_ = undefined;\n      this.closed = true;\n    }\n  };\n\n  // Polyfill-specific API.\n  HTMLTemplateElement.forAllTemplatesFrom_ = forAllTemplatesFrom;\n})(this);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope) {\n\n// inject style sheet\nvar style = document.createElement('style');\nstyle.textContent = 'template {display: none !important;} /* injected by platform.js */';\nvar head = document.querySelector('head');\nhead.insertBefore(style, head.firstChild);\n\n// flush (with logging)\nvar flushing;\nfunction flush() {\n  if (!flushing) {\n    flushing = true;\n    scope.endOfMicrotask(function() {\n      flushing = false;\n      logFlags.data && console.group('Platform.flush()');\n      scope.performMicrotaskCheckpoint();\n      logFlags.data && console.groupEnd();\n    });\n  }\n};\n\n// polling dirty checker\n// flush periodically if platform does not have object observe.\nif (!Observer.hasObjectObserve) {\n  var FLUSH_POLL_INTERVAL = 125;\n  window.addEventListener('WebComponentsReady', function() {\n    flush();\n    scope.flushPoll = setInterval(flush, FLUSH_POLL_INTERVAL);\n  });\n} else {\n  // make flush a no-op when we have Object.observe\n  flush = function() {};\n}\n\nif (window.CustomElements && !CustomElements.useNative) {\n  var originalImportNode = Document.prototype.importNode;\n  Document.prototype.importNode = function(node, deep) {\n    var imported = originalImportNode.call(this, node, deep);\n    CustomElements.upgradeAll(imported);\n    return imported;\n  }\n}\n\n// exports\nscope.flush = flush;\n\n})(window.Platform);\n\n"]}
\ No newline at end of file
diff --git a/examples/pipetobrowser/browser/libs/vendor/polymer/polymer/README.md b/examples/pipetobrowser/browser/libs/vendor/polymer/polymer/README.md
new file mode 100644
index 0000000..236a88c
--- /dev/null
+++ b/examples/pipetobrowser/browser/libs/vendor/polymer/polymer/README.md
@@ -0,0 +1,17 @@
+# Polymer
+
+[![Analytics](https://ga-beacon.appspot.com/UA-39334307-2/Polymer/polymer/README)](https://github.com/igrigorik/ga-beacon)
+
+Build Status: [http://build.chromium.org/p/client.polymer/waterfall](http://build.chromium.org/p/client.polymer/waterfall)
+
+## Brief Overview
+
+For more detailed info goto [http://polymer-project.org/](http://polymer-project.org/).
+
+Polymer is a new type of library for the web, designed to leverage the existing browser infrastructure to provide the encapsulation and extendability currently only available in JS libraries.
+
+Polymer is based on a set of future technologies, including [Shadow DOM](https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html), [Custom Elements](https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/custom/index.html) and Model Driven Views. Currently these technologies are implemented as polyfills or shims, but as browsers adopt these features natively, the platform code that drives Polymer evacipates, leaving only the value-adds.
+
+## Tools & Testing
+
+For running tests or building minified files, consult the [tooling information](http://www.polymer-project.org/resources/tooling-strategy.html).
diff --git a/examples/pipetobrowser/browser/libs/vendor/polymer/polymer/bower.json b/examples/pipetobrowser/browser/libs/vendor/polymer/polymer/bower.json
new file mode 100644
index 0000000..2228aaf
--- /dev/null
+++ b/examples/pipetobrowser/browser/libs/vendor/polymer/polymer/bower.json
@@ -0,0 +1,9 @@
+{
+  "name": "polymer",
+  "private": true,
+  "dependencies": {
+    "platform": "Polymer/platform#0.2.3",
+    "core-component-page": "Polymer/core-component-page#0.2.3"
+  },
+  "version": "0.2.3"
+}
\ No newline at end of file
diff --git a/examples/pipetobrowser/browser/libs/vendor/polymer/polymer/build.log b/examples/pipetobrowser/browser/libs/vendor/polymer/polymer/build.log
new file mode 100644
index 0000000..b3dff20
--- /dev/null
+++ b/examples/pipetobrowser/browser/libs/vendor/polymer/polymer/build.log
@@ -0,0 +1,33 @@
+BUILD LOG
+---------
+Build Time: 2014-04-18T13:26:52
+
+NODEJS INFORMATION
+==================
+nodejs: v0.10.26
+chai: 1.9.1
+grunt: 0.4.4
+grunt-audit: 0.0.3
+grunt-contrib-uglify: 0.4.0
+grunt-contrib-yuidoc: 0.5.2
+grunt-karma: 0.8.2
+karma: 0.12.2
+karma-chrome-launcher: 0.0.2
+karma-crbot-reporter: 0.0.4
+karma-firefox-launcher: 0.1.3
+karma-ie-launcher: 0.1.3
+karma-mocha: 0.1.3
+karma-safari-launcher: 0.1.1
+karma-script-launcher: 0.1.0
+mocha: 1.18.2
+Polymer: 0.2.3
+
+REPO REVISIONS
+==============
+polymer-expressions: 3bd624bbdc1de09085524529e7f259d3cac084ae
+polymer-gestures: f16090bbb8e3d08d912f33f4a1e554e56e7ba55a
+polymer-dev: 24c48ff7ae443e69dd2ee60b0f23d55753ae96cd
+
+BUILD HASHES
+============
+build/polymer.js: ef8cd13c151e94688aa961e695b6c1ea473475d5
\ No newline at end of file
diff --git a/examples/pipetobrowser/browser/libs/vendor/polymer/polymer/polymer-body.html b/examples/pipetobrowser/browser/libs/vendor/polymer/polymer/polymer-body.html
new file mode 100644
index 0000000..a9a7525
--- /dev/null
+++ b/examples/pipetobrowser/browser/libs/vendor/polymer/polymer/polymer-body.html
@@ -0,0 +1,40 @@
+<!--
+Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<polymer-element name="polymer-body" extends="body">
+<script>
+
+  // upgrade polymer-body last so that it can contain other imported elements
+  document.addEventListener('polymer-ready', function() {
+
+    Polymer('polymer-body', Platform.mixin({
+
+      created: function() {
+        this.template = document.createElement('template');
+        var body = wrap(document).body;
+        var c$ = body.childNodes.array();
+        for (var i=0, c; (c=c$[i]); i++) {
+          if (c.localName !== 'script') {
+            this.template.content.appendChild(c);
+          }
+        }
+        // snarf up user defined model
+        window.model = this;
+      },
+
+      parseDeclaration: function(elementElement) {
+        this.lightFromTemplate(this.template);
+      }
+
+    }, window.model));
+
+  });
+
+</script>
+</polymer-element>
\ No newline at end of file
diff --git a/examples/pipetobrowser/browser/libs/vendor/polymer/polymer/polymer.html b/examples/pipetobrowser/browser/libs/vendor/polymer/polymer/polymer.html
new file mode 100644
index 0000000..e9cb9c3
--- /dev/null
+++ b/examples/pipetobrowser/browser/libs/vendor/polymer/polymer/polymer.html
@@ -0,0 +1,13 @@
+<!--
+Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<script src="polymer.js"></script>
+<!--<link rel="import" href="../polymer-dev/polymer.html">--> 
+
+<link rel="import" href="polymer-body.html">
\ No newline at end of file
diff --git a/examples/pipetobrowser/browser/libs/vendor/polymer/polymer/polymer.js b/examples/pipetobrowser/browser/libs/vendor/polymer/polymer/polymer.js
new file mode 100644
index 0000000..a279e88
--- /dev/null
+++ b/examples/pipetobrowser/browser/libs/vendor/polymer/polymer/polymer.js
@@ -0,0 +1,13 @@
+/**
+ * @license
+ * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
+ * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+ * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+ * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+ * Code distributed by Google as part of the polymer project is also
+ * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+ */
+// @version: 0.2.3
+window.PolymerGestures={},function(a){var b={shadow:function(a){return a?a.shadowRoot||a.webkitShadowRoot:void 0},canTarget:function(a){return a&&Boolean(a.elementFromPoint)},targetingShadow:function(a){var b=this.shadow(a);return this.canTarget(b)?b:void 0},olderShadow:function(a){var b=a.olderShadowRoot;if(!b){var c=a.querySelector("shadow");c&&(b=c.olderShadowRoot)}return b},allShadows:function(a){for(var b=[],c=this.shadow(a);c;)b.push(c),c=this.olderShadow(c);return b},searchRoot:function(a,b,c){if(a){var d,e,f=a.elementFromPoint(b,c);for(e=this.targetingShadow(f);e;){if(d=e.elementFromPoint(b,c)){var g=this.targetingShadow(d);return this.searchRoot(g,b,c)||d}e=this.olderShadow(e)}return f}},owner:function(a){if(!a)return document;for(var b=a;b.parentNode;)b=b.parentNode;return b.nodeType!=Node.DOCUMENT_NODE&&b.nodeType!=Node.DOCUMENT_FRAGMENT_NODE&&(b=document),b},findTarget:function(a){var b=a.clientX,c=a.clientY,d=this.owner(a.target);return d.elementFromPoint(b,c)||(d=document),this.searchRoot(d,b,c)},LCA:function(a,b){if(a===b)return a;if(a.contains){if(a.contains(b))return a;if(b.contains(a))return b}var c=this.depth(a),d=this.depth(b),e=c-d;for(e>0?a=this.walk(a,e):b=this.walk(b,-e);a&&b&&a!==b;)a=this.walk(a,1),b=this.walk(b,1);return a},walk:function(a,b){for(var c=0;a&&b>c;c++)a=a.parentNode||a.host;return a},depth:function(a){for(var b=0;a;)b++,a=a.parentNode||a.host;return b},deepContains:function(a,b){var c=this.LCA(a,b);return c===a},insideNode:function(a,b,c){var d=a.getBoundingClientRect();return d.left<=b&&b<=d.right&&d.top<=c&&c<=d.bottom}};a.targetFinding=b,a.findTarget=b.findTarget.bind(b),a.deepContains=b.deepContains.bind(b),a.insideNode=b.insideNode}(window.PolymerGestures),function(){function a(a){return"body /deep/ "+b(a)}function b(a){return'[touch-action="'+a+'"]'}function c(a){return"{ -ms-touch-action: "+a+"; touch-action: "+a+";}"}var d=["none","auto","pan-x","pan-y",{rule:"pan-x pan-y",selectors:["pan-x pan-y","pan-y pan-x"]}],e="",f=(document.head,"string"==typeof document.head.style.touchAction),g=!window.ShadowDOMPolyfill&&document.head.createShadowRoot;if(f){d.forEach(function(d){String(d)===d?(e+=b(d)+c(d)+"\n",g&&(e+=a(d)+c(d)+"\n")):(e+=d.selectors.map(b)+c(d.rule)+"\n",g&&(e+=d.selectors.map(a)+c(d.rule)+"\n"))});var h=document.createElement("style");h.textContent=e,document.head.appendChild(h)}}(),function(a){var b=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","pageX","pageY"],c=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0],d=function(){return function(){}},e={preventTap:d,makeBaseEvent:function(a,b){var c=document.createEvent("Event");return c.initEvent(a,b.bubbles||!1,b.cancelable||!1),c.preventTap=e.preventTap(c),c},makeGestureEvent:function(a,b){b=b||Object.create(null);for(var c,d=this.makeBaseEvent(a,b),e=0,f=Object.keys(b);e<f.length;e++)c=f[e],d[c]=b[c];return d},makePointerEvent:function(a,d){d=d||Object.create(null);for(var e,f=this.makeBaseEvent(a,d),g=0;g<b.length;g++)e=b[g],f[e]=d[e]||c[g];f.buttons=d.buttons||0;var h=0;return h=d.pressure?d.pressure:f.buttons?.5:0,f.x=f.clientX,f.y=f.clientY,f.pointerId=d.pointerId||0,f.width=d.width||0,f.height=d.height||0,f.pressure=h,f.tiltX=d.tiltX||0,f.tiltY=d.tiltY||0,f.pointerType=d.pointerType||"",f.hwTimestamp=d.hwTimestamp||0,f.isPrimary=d.isPrimary||!1,f}};a.eventFactory=e}(window.PolymerGestures),function(a){function b(){if(c){var a=new Map;return a.pointers=d,a}this.keys=[],this.values=[]}var c=window.Map&&window.Map.prototype.forEach,d=function(){return this.size};b.prototype={set:function(a,b){var c=this.keys.indexOf(a);c>-1?this.values[c]=b:(this.keys.push(a),this.values.push(b))},has:function(a){return this.keys.indexOf(a)>-1},"delete":function(a){var b=this.keys.indexOf(a);b>-1&&(this.keys.splice(b,1),this.values.splice(b,1))},get:function(a){var b=this.keys.indexOf(a);return this.values[b]},clear:function(){this.keys.length=0,this.values.length=0},forEach:function(a,b){this.values.forEach(function(c,d){a.call(b,c,this.keys[d],this)},this)},pointers:function(){return this.keys.length}},a.PointerMap=b}(window.PolymerGestures),function(a){var b=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","buttons","pointerId","width","height","pressure","tiltX","tiltY","pointerType","hwTimestamp","isPrimary","type","target","currentTarget","which","pageX","pageY","timeStamp","preventTap","tapPrevented"],c=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0,0,0,0,0,0,"",0,!1,"",null,null,0,0,0,0,function(){},!1],d="undefined"!=typeof SVGElementInstance,e=a.eventFactory,f={pointermap:new a.PointerMap,eventMap:Object.create(null),eventSources:Object.create(null),eventSourceList:[],gestures:[],gestureQueue:[],registerSource:function(a,b){var c=b,d=c.events;d&&(d.forEach(function(a){c[a]&&(this.eventMap[a]=c[a].bind(c))},this),this.eventSources[a]=c,this.eventSourceList.push(c))},registerGesture:function(a,b){this.gestures.push(b)},register:function(a){for(var b,c=this.eventSourceList.length,d=0;c>d&&(b=this.eventSourceList[d]);d++)b.register.call(b,a)},unregister:function(a){for(var b,c=this.eventSourceList.length,d=0;c>d&&(b=this.eventSourceList[d]);d++)b.unregister.call(b,a)},down:function(a){this.fireEvent("down",a)},move:function(a){a.type="move",this.fillGestureQueue(a)},up:function(a){this.fireEvent("up",a)},eventHandler:function(a){if(!a._handledByPG){var b=a.type,c=this.eventMap&&this.eventMap[b];c&&c(a),a._handledByPG=!0}},listen:function(a,b){b.forEach(function(b){this.addEvent(a,b)},this)},unlisten:function(a,b){b.forEach(function(b){this.removeEvent(a,b)},this)},addEvent:function(a,b){a.addEventListener(b,this.boundHandler)},removeEvent:function(a,b){a.removeEventListener(b,this.boundHandler)},makeEvent:function(a,b){var c=e.makePointerEvent(a,b);return c.preventDefault=b.preventDefault,c._target=c._target||b.target,c},fireEvent:function(a,b){var c=this.makeEvent(a,b);return this.dispatchEvent(c)},cloneEvent:function(a){for(var e,f=Object.create(null),g=0;g<b.length;g++)e=b[g],f[e]=a[e]||c[g],!d||"target"!==e&&"relatedTarget"!==e||f[e]instanceof SVGElementInstance&&(f[e]=f[e].correspondingUseElement);return f.preventDefault=a.preventDefault,f},dispatchEvent:function(a){var b=a._target;if(b){b.dispatchEvent(a);var c=this.cloneEvent(a);c.target=a._target,this.fillGestureQueue(c)}},gestureTrigger:function(){for(var a,b=0;b<this.gestureQueue.length;b++){a=this.gestureQueue[b];for(var c,d=0;d<this.gestures.length;d++)c=this.gestures[d],c.events.indexOf(a.type)>=0&&c[a.type].call(c,a)}this.gestureQueue.length=0},fillGestureQueue:function(a){this.gestureQueue.length||requestAnimationFrame(this.boundGestureTrigger),this.gestureQueue.push(a)}};f.boundHandler=f.eventHandler.bind(f),f.boundGestureTrigger=f.gestureTrigger.bind(f),a.dispatcher=f,a.register=f.register.bind(f),a.unregister=f.unregister.bind(f)}(window.PolymerGestures),function(a){function b(a,b,c,d){this.addCallback=a.bind(d),this.removeCallback=b.bind(d),this.changedCallback=c.bind(d),g&&(this.observer=new g(this.mutationWatcher.bind(this)))}var c=Array.prototype.forEach.call.bind(Array.prototype.forEach),d=Array.prototype.map.call.bind(Array.prototype.map),e=Array.prototype.slice.call.bind(Array.prototype.slice),f=Array.prototype.filter.call.bind(Array.prototype.filter),g=window.MutationObserver||window.WebKitMutationObserver,h="[touch-action]",i={subtree:!0,childList:!0,attributes:!0,attributeOldValue:!0,attributeFilter:["touch-action"]};b.prototype={watchSubtree:function(b){a.targetFinding.canTarget(b)&&this.observer.observe(b,i)},enableOnSubtree:function(a){this.watchSubtree(a),a===document&&"complete"!==document.readyState?this.installOnLoad():this.installNewSubtree(a)},installNewSubtree:function(a){c(this.findElements(a),this.addElement,this)},findElements:function(a){return a.querySelectorAll?a.querySelectorAll(h):[]},removeElement:function(a){this.removeCallback(a)},addElement:function(a){this.addCallback(a)},elementChanged:function(a,b){this.changedCallback(a,b)},concatLists:function(a,b){return a.concat(e(b))},installOnLoad:function(){document.addEventListener("readystatechange",function(){"complete"===document.readyState&&this.installNewSubtree(document)}.bind(this))},isElement:function(a){return a.nodeType===Node.ELEMENT_NODE},flattenMutationTree:function(a){var b=d(a,this.findElements,this);return b.push(f(a,this.isElement)),b.reduce(this.concatLists,[])},mutationWatcher:function(a){a.forEach(this.mutationHandler,this)},mutationHandler:function(a){if("childList"===a.type){var b=this.flattenMutationTree(a.addedNodes);b.forEach(this.addElement,this);var c=this.flattenMutationTree(a.removedNodes);c.forEach(this.removeElement,this)}else"attributes"===a.type&&this.elementChanged(a.target,a.oldValue)}},g||(b.prototype.watchSubtree=function(){console.warn("PolymerGestures: MutationObservers not found, touch-action will not be dynamically detected")}),a.Installer=b}(window.PolymerGestures),function(a){var b=a.dispatcher,c=b.pointermap,d=25,e=[0,1,4,2],f=!1;try{f=1===new MouseEvent("test",{buttons:1}).buttons}catch(g){}var h={POINTER_ID:1,POINTER_TYPE:"mouse",events:["mousedown","mousemove","mouseup"],register:function(a){b.listen(a,this.events)},unregister:function(a){b.unlisten(a,this.events)},lastTouches:[],isEventSimulatedFromTouch:function(a){for(var b,c=this.lastTouches,e=a.clientX,f=a.clientY,g=0,h=c.length;h>g&&(b=c[g]);g++){var i=Math.abs(e-b.x),j=Math.abs(f-b.y);if(d>=i&&d>=j)return!0}},prepareEvent:function(a){var c=b.cloneEvent(a);return c.pointerId=this.POINTER_ID,c.isPrimary=!0,c.pointerType=this.POINTER_TYPE,f||(c.buttons=e[c.which]||0),c},mousedown:function(a){if(!this.isEventSimulatedFromTouch(a)){var d=c.has(this.POINTER_ID);d&&this.mouseup(a);var e=this.prepareEvent(a);c.set(this.POINTER_ID,a.target),b.down(e)}},mousemove:function(a){if(!this.isEventSimulatedFromTouch(a)){var d=this.prepareEvent(a);d.target=c.get(this.POINTER_ID),b.move(d)}},mouseup:function(a){if(!this.isEventSimulatedFromTouch(a)){var d=this.prepareEvent(a);d.target=c.get(this.POINTER_ID),d.relatedTarget=a.target,b.up(d),this.cleanupMouse()}},cleanupMouse:function(){c["delete"](this.POINTER_ID)}};a.mouseEvents=h}(window.PolymerGestures),function(a){var b,c=a.dispatcher,d=a.targetFinding.allShadows.bind(a.targetFinding),e=c.pointermap,f=(Array.prototype.map.call.bind(Array.prototype.map),2500),g=200,h="touch-action",i="string"==typeof document.head.style.touchAction,j={events:["touchstart","touchmove","touchend","touchcancel"],register:function(a){i?c.listen(a,this.events):b.enableOnSubtree(a)},unregister:function(a){i&&c.unlisten(a,this.events)},elementAdded:function(a){var b=a.getAttribute(h),e=this.touchActionToScrollType(b);e&&(a._scrollType=e,c.listen(a,this.events),d(a).forEach(function(a){a._scrollType=e,c.listen(a,this.events)},this))},elementRemoved:function(a){a._scrollType=void 0,c.unlisten(a,this.events),d(a).forEach(function(a){a._scrollType=void 0,c.unlisten(a,this.events)},this)},elementChanged:function(a,b){var c=a.getAttribute(h),e=this.touchActionToScrollType(c),f=this.touchActionToScrollType(b);e&&f?(a._scrollType=e,d(a).forEach(function(a){a._scrollType=e},this)):f?this.elementRemoved(a):e&&this.elementAdded(a)},scrollTypes:{EMITTER:"none",XSCROLLER:"pan-x",YSCROLLER:"pan-y",SCROLLER:/^(?:pan-x pan-y)|(?:pan-y pan-x)|auto$/},touchActionToScrollType:function(a){var b=a,c=this.scrollTypes;return"none"===b?"none":b===c.XSCROLLER?"X":b===c.YSCROLLER?"Y":c.SCROLLER.exec(b)?"XY":void 0},POINTER_TYPE:"touch",firstTouch:null,isPrimaryTouch:function(a){return this.firstTouch===a.identifier},setPrimaryTouch:function(a){(0===e.pointers()||1===e.pointers()&&e.has(1))&&(this.firstTouch=a.identifier,this.firstXY={X:a.clientX,Y:a.clientY},this.scrolling=!1,this.cancelResetClickCount())},removePrimaryPointer:function(a){a.isPrimary&&(this.firstTouch=null,this.firstXY=null,this.resetClickCount())},clickCount:0,resetId:null,resetClickCount:function(){var a=function(){this.clickCount=0,this.resetId=null}.bind(this);this.resetId=setTimeout(a,g)},cancelResetClickCount:function(){this.resetId&&clearTimeout(this.resetId)},typeToButtons:function(a){var b=0;return("touchstart"===a||"touchmove"===a)&&(b=1),b},findTarget:function(b,c){return"touchstart"===this.currentTouchEvent.type?a.findTarget(b):e.get(c)},touchToPointer:function(a){var b=this.currentTouchEvent,d=c.cloneEvent(a),e=d.pointerId=a.identifier+2;d.target=this.findTarget(a,e),d.bubbles=!0,d.cancelable=!0,d.detail=this.clickCount,d.buttons=this.typeToButtons(b.type),d.width=a.webkitRadiusX||a.radiusX||0,d.height=a.webkitRadiusY||a.radiusY||0,d.pressure=a.webkitForce||a.force||.5,d.isPrimary=this.isPrimaryTouch(a),d.pointerType=this.POINTER_TYPE;var f=this;return d.preventDefault=function(){f.scrolling=!1,f.firstXY=null,b.preventDefault()},d},processTouches:function(a,b){var c=a.changedTouches;this.currentTouchEvent=a;for(var d,e=0;e<c.length;e++)d=c[e],b.call(this,this.touchToPointer(d))},shouldScroll:function(a){if(this.firstXY){var b,c=a.currentTarget._scrollType;if("none"===c)b=!1;else if("XY"===c)b=!0;else{var d=a.changedTouches[0],e=c,f="Y"===c?"X":"Y",g=Math.abs(d["client"+e]-this.firstXY[e]),h=Math.abs(d["client"+f]-this.firstXY[f]);b=g>=h}return this.firstXY=null,b}},findTouch:function(a,b){for(var c,d=0,e=a.length;e>d&&(c=a[d]);d++)if(c.identifier===b)return!0},vacuumTouches:function(a){var b=a.touches;if(e.pointers()>=b.length){var c=[];e.forEach(function(a,d){if(1!==d&&!this.findTouch(b,d-2)){var e=a.out;c.push(e)}},this),c.forEach(this.cancelOut,this)}},touchstart:function(a){this.vacuumTouches(a),this.setPrimaryTouch(a.changedTouches[0]),this.dedupSynthMouse(a),this.scrolling||(this.clickCount++,this.processTouches(a,this.down))},down:function(a){e.set(a.pointerId,a.target);c.down(a)},touchmove:function(a){i?this.processTouches(a,this.move):this.scrolling||(this.shouldScroll(a)?(this.scrolling=!0,this.touchcancel(a)):(a.preventDefault(),this.processTouches(a,this.move)))},move:function(a){var b=e.get(a.pointerId);b&&c.move(a)},touchend:function(a){this.dedupSynthMouse(a),this.processTouches(a,this.up)},up:function(b){this.scrolling||(b.relatedTarget=a.findTarget(b),c.up(b)),this.cleanUpPointer(b)},touchcancel:function(a){this.processTouches(a,this.up)},cleanUpPointer:function(a){e["delete"](a.pointerId),this.removePrimaryPointer(a)},dedupSynthMouse:function(b){var c=a.mouseEvents.lastTouches,d=b.changedTouches[0];if(this.isPrimaryTouch(d)){var e={x:d.clientX,y:d.clientY};c.push(e);var g=function(a,b){var c=a.indexOf(b);c>-1&&a.splice(c,1)}.bind(null,c,e);setTimeout(g,f)}}};i||(b=new a.Installer(j.elementAdded,j.elementRemoved,j.elementChanged,j)),a.touchEvents=j}(window.PolymerGestures),function(a){var b=a.dispatcher,c=b.pointermap,d=window.MSPointerEvent&&"number"==typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE,e={events:["MSPointerDown","MSPointerMove","MSPointerUp","MSPointerCancel"],register:function(a){b.listen(a,this.events)},unregister:function(a){b.unlisten(a,this.events)},POINTER_TYPES:["","unavailable","touch","pen","mouse"],prepareEvent:function(a){var c=a;return d&&(c=b.cloneEvent(a),c.pointerType=this.POINTER_TYPES[a.pointerType]),c},cleanup:function(a){c["delete"](a)},MSPointerDown:function(a){c.set(a.pointerId,a.target);var d=this.prepareEvent(a);b.down(d)},MSPointerMove:function(a){var d=this.prepareEvent(a);d.target=c.get(a.pointerId),b.move(d)},MSPointerUp:function(a){var d=this.prepareEvent(a);d.target=c.get(a.pointerId),d.relatedTarget=a.target,b.up(d),this.cleanup(a.pointerId)},MSPointerCancel:function(a){this.MSPointerUp(a)}};a.msEvents=e}(window.PolymerGestures),function(a){var b=a.dispatcher,c=b.pointermap,d={events:["pointerdown","pointermove","pointerup","pointercancel"],prepareEvent:function(a){return b.cloneEvent(a)},register:function(a){b.listen(a,this.events)},unregister:function(a){b.unlisten(a,this.events)},cleanup:function(a){c["delete"](a)},pointerdown:function(a){c.set(a.pointerId,a.target);var d=this.prepareEvent(a);b.down(d)},pointermove:function(a){var d=this.prepareEvent(a);d.target=c.get(a.pointerId),b.move(d)},pointerup:function(a){var d=this.prepareEvent(a);d.target=c.get(a.pointerId),d.relatedTarget=a.target,b.up(d),this.cleanup(a.pointerId)},pointercancel:function(a){this.pointerup(a)}};a.pointerEvents=d}(window.PolymerGestures),function(a){var b=a.dispatcher;window.PointerEvent?b.registerSource("pointer",a.pointerEvents):window.navigator.msPointerEnabled?b.registerSource("ms",a.msEvents):(b.registerSource("mouse",a.mouseEvents),void 0!==window.ontouchstart&&b.registerSource("touch",a.touchEvents)),b.register(document)}(window.PolymerGestures),function(a){var b=a.dispatcher,c=a.eventFactory,d=new a.PointerMap,e={events:["down","move","up"],WIGGLE_THRESHOLD:4,clampDir:function(a){return a>0?1:-1},calcPositionDelta:function(a,b){var c=0,d=0;return a&&b&&(c=b.pageX-a.pageX,d=b.pageY-a.pageY),{x:c,y:d}},fireTrack:function(a,b,d){var e=d,f=this.calcPositionDelta(e.downEvent,b),g=this.calcPositionDelta(e.lastMoveEvent,b);g.x&&(e.xDirection=this.clampDir(g.x)),g.y&&(e.yDirection=this.clampDir(g.y));var h=c.makeGestureEvent(a,{bubbles:!0,cancelable:!0,dx:f.x,dy:f.y,ddx:g.x,ddy:g.y,x:b.x,y:b.y,clientX:b.clientX,clientY:b.clientY,pageX:b.pageX,pageY:b.pageY,screenX:b.screenX,screenY:b.screenY,xDirection:e.xDirection,yDirection:e.yDirection,trackInfo:e.trackInfo,relatedTarget:b.relatedTarget,pointerType:b.pointerType,pointerId:b.pointerId});e.downTarget.dispatchEvent(h)},down:function(a){if(a.isPrimary&&("mouse"===a.pointerType?1===a.buttons:!0)){var b={downEvent:a,downTarget:a.target,trackInfo:{},lastMoveEvent:null,xDirection:0,yDirection:0,tracking:!1};d.set(a.pointerId,b)}},move:function(a){var b=d.get(a.pointerId);if(b){if(b.tracking)this.fireTrack("track",a,b);else{var c=this.calcPositionDelta(b.downEvent,a),e=c.x*c.x+c.y*c.y;e>this.WIGGLE_THRESHOLD&&(b.tracking=!0,this.fireTrack("trackstart",b.downEvent,b),this.fireTrack("track",a,b))}b.lastMoveEvent=a}},up:function(a){var b=d.get(a.pointerId);b&&(b.tracking&&this.fireTrack("trackend",a,b),d.delete(a.pointerId))}};b.registerGesture("track",e)}(window.PolymerGestures),function(a){var b=a.dispatcher,c=a.eventFactory,d=new a.PointerMap,e={events:["down","up"],down:function(a){a.isPrimary&&!a.tapPrevented&&d.set(a.pointerId,{target:a.target,buttons:a.buttons,x:a.clientX,y:a.clientY})},shouldTap:function(a,b){return"mouse"===a.pointerType?1===b.buttons:!0},up:function(b){var e=d.get(b.pointerId);if(e&&this.shouldTap(b,e)){var f=a.targetFinding.LCA(e.target,b.relatedTarget);if(f){var g=c.makeGestureEvent("tap",{bubbles:!0,cancelable:!0,x:b.clientX,y:b.clientY,detail:b.detail,pointerType:b.pointerType,pointerId:b.pointerId,altKey:b.altKey,ctrlKey:b.ctrlKey,metaKey:b.metaKey,shiftKey:b.shiftKey});f.dispatchEvent(g)}}d.delete(b.pointerId)}};c.preventTap=function(a){return function(){d.delete(a.pointerId)}},b.registerGesture("tap",e)}(window.PolymerGestures),function(a){"use strict";function b(a,b){if(!a)throw new Error("ASSERT: "+b)}function c(a){return a>=48&&57>=a}function d(a){return 32===a||9===a||11===a||12===a||160===a||a>=5760&&" ᠎              ".indexOf(String.fromCharCode(a))>0}function e(a){return 10===a||13===a||8232===a||8233===a}function f(a){return 36===a||95===a||a>=65&&90>=a||a>=97&&122>=a}function g(a){return 36===a||95===a||a>=65&&90>=a||a>=97&&122>=a||a>=48&&57>=a}function h(a){return"this"===a}function i(){for(;Y>X&&d(W.charCodeAt(X));)++X}function j(){var a,b;for(a=X++;Y>X&&(b=W.charCodeAt(X),g(b));)++X;return W.slice(a,X)}function k(){var a,b,c;return a=X,b=j(),c=1===b.length?S.Identifier:h(b)?S.Keyword:"null"===b?S.NullLiteral:"true"===b||"false"===b?S.BooleanLiteral:S.Identifier,{type:c,value:b,range:[a,X]}}function l(){var a,b,c=X,d=W.charCodeAt(X),e=W[X];switch(d){case 46:case 40:case 41:case 59:case 44:case 123:case 125:case 91:case 93:case 58:case 63:return++X,{type:S.Punctuator,value:String.fromCharCode(d),range:[c,X]};default:if(a=W.charCodeAt(X+1),61===a)switch(d){case 37:case 38:case 42:case 43:case 45:case 47:case 60:case 62:case 124:return X+=2,{type:S.Punctuator,value:String.fromCharCode(d)+String.fromCharCode(a),range:[c,X]};case 33:case 61:return X+=2,61===W.charCodeAt(X)&&++X,{type:S.Punctuator,value:W.slice(c,X),range:[c,X]}}}return b=W[X+1],e===b&&"&|".indexOf(e)>=0?(X+=2,{type:S.Punctuator,value:e+b,range:[c,X]}):"<>=!+-*%&|^/".indexOf(e)>=0?(++X,{type:S.Punctuator,value:e,range:[c,X]}):void s({},V.UnexpectedToken,"ILLEGAL")}function m(){var a,d,e;if(e=W[X],b(c(e.charCodeAt(0))||"."===e,"Numeric literal must start with a decimal digit or a decimal point"),d=X,a="","."!==e){for(a=W[X++],e=W[X],"0"===a&&e&&c(e.charCodeAt(0))&&s({},V.UnexpectedToken,"ILLEGAL");c(W.charCodeAt(X));)a+=W[X++];e=W[X]}if("."===e){for(a+=W[X++];c(W.charCodeAt(X));)a+=W[X++];e=W[X]}if("e"===e||"E"===e)if(a+=W[X++],e=W[X],("+"===e||"-"===e)&&(a+=W[X++]),c(W.charCodeAt(X)))for(;c(W.charCodeAt(X));)a+=W[X++];else s({},V.UnexpectedToken,"ILLEGAL");return f(W.charCodeAt(X))&&s({},V.UnexpectedToken,"ILLEGAL"),{type:S.NumericLiteral,value:parseFloat(a),range:[d,X]}}function n(){var a,c,d,f="",g=!1;for(a=W[X],b("'"===a||'"'===a,"String literal must starts with a quote"),c=X,++X;Y>X;){if(d=W[X++],d===a){a="";break}if("\\"===d)if(d=W[X++],d&&e(d.charCodeAt(0)))"\r"===d&&"\n"===W[X]&&++X;else switch(d){case"n":f+="\n";break;case"r":f+="\r";break;case"t":f+="	";break;case"b":f+="\b";break;case"f":f+="\f";break;case"v":f+="";break;default:f+=d}else{if(e(d.charCodeAt(0)))break;f+=d}}return""!==a&&s({},V.UnexpectedToken,"ILLEGAL"),{type:S.StringLiteral,value:f,octal:g,range:[c,X]}}function o(a){return a.type===S.Identifier||a.type===S.Keyword||a.type===S.BooleanLiteral||a.type===S.NullLiteral}function p(){var a;return i(),X>=Y?{type:S.EOF,range:[X,X]}:(a=W.charCodeAt(X),40===a||41===a||58===a?l():39===a||34===a?n():f(a)?k():46===a?c(W.charCodeAt(X+1))?m():l():c(a)?m():l())}function q(){var a;return a=$,X=a.range[1],$=p(),X=a.range[1],a}function r(){var a;a=X,$=p(),X=a}function s(a,c){var d,e=Array.prototype.slice.call(arguments,2),f=c.replace(/%(\d)/g,function(a,c){return b(c<e.length,"Message reference must be in range"),e[c]});throw d=new Error(f),d.index=X,d.description=f,d}function t(a){s(a,V.UnexpectedToken,a.value)}function u(a){var b=q();(b.type!==S.Punctuator||b.value!==a)&&t(b)}function v(a){return $.type===S.Punctuator&&$.value===a}function w(a){return $.type===S.Keyword&&$.value===a}function x(){var a=[];for(u("[");!v("]");)v(",")?(q(),a.push(null)):(a.push(bb()),v("]")||u(","));return u("]"),Z.createArrayExpression(a)}function y(){var a;return i(),a=q(),a.type===S.StringLiteral||a.type===S.NumericLiteral?Z.createLiteral(a):Z.createIdentifier(a.value)}function z(){var a,b;return a=$,i(),(a.type===S.EOF||a.type===S.Punctuator)&&t(a),b=y(),u(":"),Z.createProperty("init",b,bb())}function A(){var a=[];for(u("{");!v("}");)a.push(z()),v("}")||u(",");return u("}"),Z.createObjectExpression(a)}function B(){var a;return u("("),a=bb(),u(")"),a}function C(){var a,b,c;return v("(")?B():(a=$.type,a===S.Identifier?c=Z.createIdentifier(q().value):a===S.StringLiteral||a===S.NumericLiteral?c=Z.createLiteral(q()):a===S.Keyword?w("this")&&(q(),c=Z.createThisExpression()):a===S.BooleanLiteral?(b=q(),b.value="true"===b.value,c=Z.createLiteral(b)):a===S.NullLiteral?(b=q(),b.value=null,c=Z.createLiteral(b)):v("[")?c=x():v("{")&&(c=A()),c?c:void t(q()))}function D(){var a=[];if(u("("),!v(")"))for(;Y>X&&(a.push(bb()),!v(")"));)u(",");return u(")"),a}function E(){var a;return a=q(),o(a)||t(a),Z.createIdentifier(a.value)}function F(){return u("."),E()}function G(){var a;return u("["),a=bb(),u("]"),a}function H(){var a,b;for(a=C();v(".")||v("[");)v("[")?(b=G(),a=Z.createMemberExpression("[",a,b)):(b=F(),a=Z.createMemberExpression(".",a,b));return a}function I(){var a,b;return $.type!==S.Punctuator&&$.type!==S.Keyword?b=ab():v("+")||v("-")||v("!")?(a=q(),b=I(),b=Z.createUnaryExpression(a.value,b)):w("delete")||w("void")||w("typeof")?s({},V.UnexpectedToken):b=ab(),b}function J(a){var b=0;if(a.type!==S.Punctuator&&a.type!==S.Keyword)return 0;switch(a.value){case"||":b=1;break;case"&&":b=2;break;case"==":case"!=":case"===":case"!==":b=6;break;case"<":case">":case"<=":case">=":case"instanceof":b=7;break;case"in":b=7;break;case"+":case"-":b=9;break;case"*":case"/":case"%":b=11}return b}function K(){var a,b,c,d,e,f,g,h;if(g=I(),b=$,c=J(b),0===c)return g;for(b.prec=c,q(),e=I(),d=[g,b,e];(c=J($))>0;){for(;d.length>2&&c<=d[d.length-2].prec;)e=d.pop(),f=d.pop().value,g=d.pop(),a=Z.createBinaryExpression(f,g,e),d.push(a);b=q(),b.prec=c,d.push(b),a=I(),d.push(a)}for(h=d.length-1,a=d[h];h>1;)a=Z.createBinaryExpression(d[h-1].value,d[h-2],a),h-=2;return a}function L(){var a,b,c;return a=K(),v("?")&&(q(),b=L(),u(":"),c=L(),a=Z.createConditionalExpression(a,b,c)),a}function M(){var a,b;return a=q(),a.type!==S.Identifier&&t(a),b=v("(")?D():[],Z.createFilter(a.value,b)}function N(){for(;v("|");)q(),M()}function O(){i(),r();var a=bb();a&&(","===$.value||"in"==$.value&&a.type===U.Identifier?Q(a):(N(),"as"===$.value?P(a):Z.createTopLevel(a))),$.type!==S.EOF&&t($)}function P(a){q();var b=q().value;Z.createAsExpression(a,b)}function Q(a){var b;","===$.value&&(q(),$.type!==S.Identifier&&t($),b=q().value),q();var c=bb();N(),Z.createInExpression(a.name,b,c)}function R(a,b){return Z=b,W=a,X=0,Y=W.length,$=null,_={labelSet:{}},O()}var S,T,U,V,W,X,Y,Z,$,_;S={BooleanLiteral:1,EOF:2,Identifier:3,Keyword:4,NullLiteral:5,NumericLiteral:6,Punctuator:7,StringLiteral:8},T={},T[S.BooleanLiteral]="Boolean",T[S.EOF]="<end>",T[S.Identifier]="Identifier",T[S.Keyword]="Keyword",T[S.NullLiteral]="Null",T[S.NumericLiteral]="Numeric",T[S.Punctuator]="Punctuator",T[S.StringLiteral]="String",U={ArrayExpression:"ArrayExpression",BinaryExpression:"BinaryExpression",CallExpression:"CallExpression",ConditionalExpression:"ConditionalExpression",EmptyStatement:"EmptyStatement",ExpressionStatement:"ExpressionStatement",Identifier:"Identifier",Literal:"Literal",LabeledStatement:"LabeledStatement",LogicalExpression:"LogicalExpression",MemberExpression:"MemberExpression",ObjectExpression:"ObjectExpression",Program:"Program",Property:"Property",ThisExpression:"ThisExpression",UnaryExpression:"UnaryExpression"},V={UnexpectedToken:"Unexpected token %0",UnknownLabel:"Undefined label '%0'",Redeclaration:"%0 '%1' has already been declared"};var ab=H,bb=L;a.esprima={parse:R}}(this),function(a){"use strict";function b(a,b,d,e){var f;try{if(f=c(a),f.scopeIdent&&(d.nodeType!==Node.ELEMENT_NODE||"TEMPLATE"!==d.tagName||"bind"!==b&&"repeat"!==b))throw Error("as and in can only be used within <template bind/repeat>")}catch(g){return void console.error("Invalid expression syntax: "+a,g)}return function(a,b,c){var d=f.getBinding(a,e,c);return f.scopeIdent&&d&&(b.polymerExpressionScopeIdent_=f.scopeIdent,f.indexIdent&&(b.polymerExpressionIndexIdent_=f.indexIdent)),d}}function c(a){var b=t[a];if(!b){var c=new j;esprima.parse(a,c),b=new l(c),t[a]=b}return b}function d(a){this.value=a,this.valueFn_=void 0}function e(a){this.name=a,this.path=Path.get(a)}function f(a,b,c){"["==c&&b instanceof d&&Path.get(b.value).valid&&(c=".",b=new e(b.value)),this.dynamicDeps="function"==typeof a||a.dynamic,this.dynamic="function"==typeof b||b.dynamic||"["==c,this.simplePath=!this.dynamic&&!this.dynamicDeps&&b instanceof e&&(a instanceof f||a instanceof e),this.object=this.simplePath?a:i(a),this.property="."==c?b:i(b)}function g(a,b){this.name=a,this.args=[];for(var c=0;c<b.length;c++)this.args[c]=i(b[c])}function h(){throw Error("Not Implemented")}function i(a){return"function"==typeof a?a:a.valueFn()}function j(){this.expression=null,this.filters=[],this.deps={},this.currentPath=void 0,this.scopeIdent=void 0,this.indexIdent=void 0,this.dynamicDeps=!1}function k(a){this.value_=a}function l(a){if(this.scopeIdent=a.scopeIdent,this.indexIdent=a.indexIdent,!a.expression)throw Error("No expression found.");this.expression=a.expression,i(this.expression),this.filters=a.filters,this.dynamicDeps=a.dynamicDeps}function m(a){return String(a).replace(/[A-Z]/g,function(a){return"-"+a.toLowerCase()})}function n(a){return"o"===a[0]&&"n"===a[1]&&"-"===a[2]}function o(a,b){for(;a[x]&&!Object.prototype.hasOwnProperty.call(a,b);)a=a[x];return a}function p(a,b){if(0==b.length)return void 0;if(1==b.length)return o(a,b[0]);for(var c=0;null!=a&&c<b.length-1;c++)a=a[b[c]];return a}function q(a,b,c){var d=b.substring(3);return d=w[d]||d,function(b,e,f){function g(){return"{{ "+a+" }}"}var h,i,j;return j="function"==typeof c.resolveEventHandler?function(d){h=h||c.resolveEventHandler(b,a,e),h&&(h(d,d.detail,d.currentTarget),Platform&&"function"==typeof Platform.flush&&Platform.flush())}:function(c){h=h||a.getValueFrom(b),i=i||p(b,a,e),h&&(h.apply(i,[c,c.detail,c.currentTarget]),Platform&&"function"==typeof Platform.flush&&Platform.flush())},e.addEventListener(d,j),f?void 0:{open:g,discardChanges:g,close:function(){e.removeEventListener(d,j)}}}}function r(a){switch(a){case"":return!1;case"false":case"null":case"true":return!0}return isNaN(Number(a))?!1:!0}function s(){}var t=Object.create(null);d.prototype={valueFn:function(){if(!this.valueFn_){var a=this.value;this.valueFn_=function(){return a}}return this.valueFn_}},e.prototype={valueFn:function(){if(!this.valueFn_){var a=(this.name,this.path);this.valueFn_=function(b,c){return c&&c.addPath(b,a),a.getValueFrom(b)}}return this.valueFn_},setValue:function(a,b){return 1==this.path.length,a=o(a,this.path[0]),this.path.setValueFrom(a,b)}},f.prototype={get fullPath(){if(!this.fullPath_){var a=this.object instanceof e?this.object.name:this.object.fullPath;this.fullPath_=Path.get(a+"."+this.property.name)}return this.fullPath_},valueFn:function(){if(!this.valueFn_){var a=this.object;if(this.simplePath){var b=this.fullPath;this.valueFn_=function(a,c){return c&&c.addPath(a,b),b.getValueFrom(a)}}else if(this.property instanceof e){var b=Path.get(this.property.name);this.valueFn_=function(c,d){var e=a(c,d);return d&&d.addPath(e,b),b.getValueFrom(e)}}else{var c=this.property;this.valueFn_=function(b,d){var e=a(b,d),f=c(b,d);return d&&d.addPath(e,f),e?e[f]:void 0}}}return this.valueFn_},setValue:function(a,b){if(this.simplePath)return this.fullPath.setValueFrom(a,b),b;var c=this.object(a),d=this.property instanceof e?this.property.name:this.property(a);return c[d]=b}},g.prototype={transform:function(a,b,c,d,e){var f=c[this.name],g=d;if(f)g=void 0;else if(f=g[this.name],!f)return void console.error("Cannot find filter: "+this.name);if(b?f=f.toModel:"function"==typeof f.toDOM&&(f=f.toDOM),"function"!=typeof f)return void console.error("No "+(b?"toModel":"toDOM")+" found on"+this.name);for(var h=[a],j=0;j<this.args.length;j++)h[j+1]=i(this.args[j])(d,e);return f.apply(g,h)}};var u={"+":function(a){return+a},"-":function(a){return-a},"!":function(a){return!a}},v={"+":function(a,b){return a+b},"-":function(a,b){return a-b},"*":function(a,b){return a*b},"/":function(a,b){return a/b},"%":function(a,b){return a%b},"<":function(a,b){return b>a},">":function(a,b){return a>b},"<=":function(a,b){return b>=a},">=":function(a,b){return a>=b},"==":function(a,b){return a==b},"!=":function(a,b){return a!=b},"===":function(a,b){return a===b},"!==":function(a,b){return a!==b},"&&":function(a,b){return a&&b},"||":function(a,b){return a||b}};j.prototype={createUnaryExpression:function(a,b){if(!u[a])throw Error("Disallowed operator: "+a);return b=i(b),function(c,d){return u[a](b(c,d))}},createBinaryExpression:function(a,b,c){if(!v[a])throw Error("Disallowed operator: "+a);return b=i(b),c=i(c),function(d,e){return v[a](b(d,e),c(d,e))}},createConditionalExpression:function(a,b,c){return a=i(a),b=i(b),c=i(c),function(d,e){return a(d,e)?b(d,e):c(d,e)}},createIdentifier:function(a){var b=new e(a);return b.type="Identifier",b
+},createMemberExpression:function(a,b,c){var d=new f(b,c,a);return d.dynamicDeps&&(this.dynamicDeps=!0),d},createLiteral:function(a){return new d(a.value)},createArrayExpression:function(a){for(var b=0;b<a.length;b++)a[b]=i(a[b]);return function(b,c){for(var d=[],e=0;e<a.length;e++)d.push(a[e](b,c));return d}},createProperty:function(a,b,c){return{key:b instanceof e?b.name:b.value,value:c}},createObjectExpression:function(a){for(var b=0;b<a.length;b++)a[b].value=i(a[b].value);return function(b,c){for(var d={},e=0;e<a.length;e++)d[a[e].key]=a[e].value(b,c);return d}},createFilter:function(a,b){this.filters.push(new g(a,b))},createAsExpression:function(a,b){this.expression=a,this.scopeIdent=b},createInExpression:function(a,b,c){this.expression=c,this.scopeIdent=a,this.indexIdent=b},createTopLevel:function(a){this.expression=a},createThisExpression:h},k.prototype={open:function(){return this.value_},discardChanges:function(){return this.value_},deliver:function(){},close:function(){}},l.prototype={getBinding:function(a,b,c){function d(){if(h)return h=!1,g;i.dynamicDeps&&f.startReset();var c=i.getValue(a,i.dynamicDeps?f:void 0,b);return i.dynamicDeps&&f.finishReset(),c}function e(c){return i.setValue(a,c,b),c}if(c)return this.getValue(a,void 0,b);var f=new CompoundObserver,g=this.getValue(a,f,b),h=!0,i=this;return new ObserverTransform(f,d,e,!0)},getValue:function(a,b,c){for(var d=i(this.expression)(a,b),e=0;e<this.filters.length;e++)d=this.filters[e].transform(d,!1,c,a,b);return d},setValue:function(a,b,c){for(var d=this.filters?this.filters.length:0;d-->0;)b=this.filters[d].transform(b,!0,c,a);return this.expression.setValue?this.expression.setValue(a,b):void 0}};var w={};["webkitAnimationStart","webkitAnimationEnd","webkitTransitionEnd","DOMFocusOut","DOMFocusIn","DOMMouseScroll"].forEach(function(a){w[a.toLowerCase()]=a});var x="@"+Math.random().toString(36).slice(2);s.prototype={styleObject:function(a){var b=[];for(var c in a)b.push(m(c)+": "+a[c]);return b.join("; ")},tokenList:function(a){var b=[];for(var c in a)a[c]&&b.push(c);return b.join(" ")},prepareInstancePositionChanged:function(a){var b=a.polymerExpressionIndexIdent_;if(b)return function(a,c){a.model[b]=c}},prepareBinding:function(a,c,d){var e=Path.get(a);if(n(c))return e.valid?q(e,c,this):void console.error("on-* bindings must be simple path expressions");{if(r(a)||!e.valid)return b(a,c,d,this);if(1==e.length)return function(a,b,c){if(c)return e.getValueFrom(a);var d=o(a,e[0]);return new PathObserver(d,e)}}},prepareInstanceModel:function(a){var b=a.polymerExpressionScopeIdent_;if(b){var c=a.templateInstance?a.templateInstance.model:a.model,d=a.polymerExpressionIndexIdent_;return function(a){var e=Object.create(c);return e[b]=a,e[d]=void 0,e[x]=c,e}}}},a.PolymerExpressions=s,a.exposeGetExpression&&(a.getExpression_=c),a.PolymerExpressions.prepareEventBinding=q}(this),Polymer={},"function"==typeof window.Polymer&&(Polymer={}),function(a){function b(a,b){return a&&b&&Object.getOwnPropertyNames(b).forEach(function(c){var d=Object.getOwnPropertyDescriptor(b,c);d&&(Object.defineProperty(a,c,d),"function"==typeof d.value&&(d.value.nom=c))}),a}a.extend=b}(Polymer),function(a){function b(a,b,d){return a?a.stop():a=new c(this),a.go(b,d),a}var c=function(a){this.context=a,this.boundComplete=this.complete.bind(this)};c.prototype={go:function(a,b){this.callback=a;var c;b?(c=setTimeout(this.boundComplete,b),this.handle=function(){clearTimeout(c)}):(c=requestAnimationFrame(this.boundComplete),this.handle=function(){cancelAnimationFrame(c)})},stop:function(){this.handle&&(this.handle(),this.handle=null)},complete:function(){this.handle&&(this.stop(),this.callback.call(this.context))}},a.job=b}(Polymer),function(){var a={};HTMLElement.register=function(b,c){a[b]=c},HTMLElement.getPrototypeForTag=function(b){var c=b?a[b]:HTMLElement.prototype;return c||Object.getPrototypeOf(document.createElement(b))};var b=Event.prototype.stopPropagation;Event.prototype.stopPropagation=function(){this.cancelBubble=!0,b.apply(this,arguments)}}(Polymer),function(a){function b(a){var c=b.caller,g=c.nom,h=c._super;if(h||(g||(g=c.nom=e.call(this,c)),g||console.warn("called super() on a method not installed declaratively (has no .nom property)"),h=d(c,g,f(this))),h){var i=h[g];return i._super||d(i,g,h),i.apply(this,a||[])}}function c(a,b,c){for(;a;){if(a[b]!==c&&a[b])return a;a=f(a)}}function d(a,b,d){return a._super=c(d,b,a),a._super&&(a._super[b].nom=b),a._super}function e(a){for(var b=this.__proto__;b&&b!==HTMLElement.prototype;){for(var c,d=Object.getOwnPropertyNames(b),e=0,f=d.length;f>e&&(c=d[e]);e++){var g=Object.getOwnPropertyDescriptor(b,c);if("function"==typeof g.value&&g.value===a)return c}b=b.__proto__}}function f(a){return a.__proto__}a.super=b}(Polymer),function(a){function b(a,b){var d=typeof b;return b instanceof Date&&(d="date"),c[d](a,b)}var c={string:function(a){return a},date:function(a){return new Date(Date.parse(a)||Date.now())},"boolean":function(a){return""===a?!0:"false"===a?!1:!!a},number:function(a){var b=parseFloat(a);return 0===b&&(b=parseInt(a)),isNaN(b)?a:b},object:function(a,b){if(null===b)return a;try{return JSON.parse(a.replace(/'/g,'"'))}catch(c){return a}},"function":function(a,b){return b}};a.deserializeValue=b}(Polymer),function(a){var b=a.extend,c={};c.declaration={},c.instance={},c.publish=function(a,c){for(var d in a)b(c,a[d])},a.api=c}(Polymer),function(a){var b={async:function(a,b,c){Platform.flush(),b=b&&b.length?b:[b];var d=function(){(this[a]||a).apply(this,b)}.bind(this),e=c?setTimeout(d,c):requestAnimationFrame(d);return c?e:~e},cancelAsync:function(a){0>a?cancelAnimationFrame(~a):clearTimeout(a)},fire:function(a,b,c,d,e){var f=c||this,b=b||{},g=new CustomEvent(a,{bubbles:void 0!==d?d:!0,cancelable:void 0!==e?e:!0,detail:b});return f.dispatchEvent(g),g},asyncFire:function(){this.async("fire",arguments)},classFollows:function(a,b,c){b&&b.classList.remove(c),a&&a.classList.add(c)}},c=function(){},d={};b.asyncMethod=b.async,a.api.instance.utils=b,a.nop=c,a.nob=d}(Polymer),function(a){var b=window.logFlags||{},c="on-",d={EVENT_PREFIX:c,addHostListeners:function(){var a=this.eventDelegates;b.events&&Object.keys(a).length>0&&console.log("[%s] addHostListeners:",this.localName,a);var d,e,f=this;for(var g in a)e=c+g,(d=PolymerExpressions.prepareEventBinding(Path.get(a[g]),e,{resolveEventHandler:function(a,b){var c=b.getValueFrom(f);return c?c.bind(f):void 0}}))(this,this,!1)},dispatchMethod:function(a,c,d){if(a){b.events&&console.group("[%s] dispatch [%s]",a.localName,c);var e="function"==typeof c?c:a[c];e&&e[d?"apply":"call"](a,d),b.events&&console.groupEnd(),Platform.flush()}}};a.api.instance.events=d}(Polymer),function(a){var b={copyInstanceAttributes:function(){var a=this._instanceAttributes;for(var b in a)this.hasAttribute(b)||this.setAttribute(b,a[b])},takeAttributes:function(){if(this._publishLC)for(var a,b=0,c=this.attributes,d=c.length;(a=c[b])&&d>b;b++)this.attributeToProperty(a.name,a.value)},attributeToProperty:function(b,c){var b=this.propertyForAttribute(b);if(b){if(c&&c.search(a.bindPattern)>=0)return;var d=this[b],c=this.deserializeValue(c,d);c!==d&&(this[b]=c)}},propertyForAttribute:function(a){var b=this._publishLC&&this._publishLC[a];return b},deserializeValue:function(b,c){return a.deserializeValue(b,c)},serializeValue:function(a,b){return"boolean"===b?a?"":void 0:"object"!==b&&"function"!==b&&void 0!==a?a:void 0},reflectPropertyToAttribute:function(a){var b=typeof this[a],c=this.serializeValue(this[a],b);void 0!==c?this.setAttribute(a,c):"boolean"===b&&this.removeAttribute(a)}};a.api.instance.attributes=b}(Polymer),function(a){function b(a,b,e){return d.bind&&console.log(f,e.path_,inPath,a.localName,b),Observer.bindToInstance(a,b,e,c)}function c(a,b){return null===b||void 0===b?a:b}var d=window.logFlags||{},e={createPropertyObserver:function(){var a=this._observeNames;if(a&&a.length){var b=this._propertyObserver=new CompoundObserver(!0);this.registerObservers([b]);for(var c,d=0,e=a.length;e>d&&(c=a[d]);d++)b.addPath(this,c),this.observeArrayValue(c,this[c],null)}},openPropertyObserver:function(){this._propertyObserver&&this._propertyObserver.open(this.notifyPropertyChanges,this)},notifyPropertyChanges:function(a,b,c){var d,e,f={};for(var g in b)d=c[2*g+1],e=this.observe[d],e&&(this.observeArrayValue(d,a[g],b[g]),f[e]||(f[e]=!0,this.invokeMethod(e,[b[g],a[g],arguments])))},propertyChanged_:function(a){this.reflect[a]&&this.reflectPropertyToAttribute(a)},observeArrayValue:function(a,b,c){var e=this.observe[a];if(e&&(Array.isArray(c)&&(d.observe&&console.log("[%s] observeArrayValue: unregister observer [%s]",this.localName,a),this.closeNamedObserver(a+"__array")),Array.isArray(b))){d.observe&&console.log("[%s] observeArrayValue: register observer [%s]",this.localName,a,b);var f=new ArrayObserver(b);f.open(function(a,b){this.invokeMethod(e,[b])},this),this.registerNamedObserver(a+"__array",f)}},bindProperty:function(a,c,d){return d?void(this[a]=c):b(this,a,c)},invokeMethod:function(a,b){var c=this[a]||a;"function"==typeof c&&c.apply(this,b)},registerObservers:function(a){this._observers=this._observers||[],this._observers.push(a)},closeObservers:function(){for(var a=0,b=this._observers.length;b>a;a++)this.closeObserverArray(this._observers[a]);this._observers=[]},closeObserverArray:function(a){for(var b,c=0,d=a.length;d>c;c++)b=a[c],b&&b.close&&b.close()},registerNamedObserver:function(a,b){var c=this._namedObservers||(this._namedObservers={});c[a]=b},closeNamedObserver:function(a){var b=this._namedObservers;return b&&b[a]?(b[a].close(),b[a]=null,!0):void 0},closeNamedObservers:function(){if(this._namedObservers){for(var a,b,c=Object.keys(this._namedObservers),d=0,e=c.length;e>d&&(a=c[d]);d++)b=this._namedObservers[a],b.close();this._namedObservers={}}}},f="[%s]: bindProperties: [%s] to [%s].[%s]";a.api.instance.properties=e}(Polymer),function(a){var b=window.logFlags||0,c={instanceTemplate:function(a){var b=this.syntax||!a.bindingDelegate&&this.element.syntax,c=a.createInstance(this,b);return this.registerObservers(c.bindings_),c},bind:function(a,b,c){var d=this.propertyForAttribute(a);if(d){var e=this.bindProperty(d,b,c);return Platform.enableBindingsReflection&&e&&(e.path=b.path_,this.bindings_=this.bindings_||{},this.bindings_[d]=e),this.reflect[d]&&this.reflectPropertyToAttribute(d),e}return this.mixinSuper(arguments)},bindFinished:function(){this.makeElementReady()},asyncUnbindAll:function(){this._unbound||(b.unbind&&console.log("[%s] asyncUnbindAll",this.localName),this._unbindAllJob=this.job(this._unbindAllJob,this.unbindAll,0))},unbindAll:function(){this._unbound||(this.closeObservers(),this.closeNamedObservers(),this._unbound=!0)},cancelUnbindAll:function(){return this._unbound?void(b.unbind&&console.warn("[%s] already unbound, cannot cancel unbindAll",this.localName)):(b.unbind&&console.log("[%s] cancelUnbindAll",this.localName),void(this._unbindAllJob&&(this._unbindAllJob=this._unbindAllJob.stop())))}},d=/\{\{([^{}]*)}}/;a.bindPattern=d,a.api.instance.mdv=c}(Polymer),function(a){function b(a){return a.hasOwnProperty("PolymerBase")}function c(){}var d={PolymerBase:!0,job:function(a,b,c){if("string"!=typeof a)return Polymer.job.call(this,a,b,c);var d="___"+a;this[d]=Polymer.job.call(this,this[d],b,c)},"super":Polymer.super,created:function(){},ready:function(){},createdCallback:function(){this.templateInstance&&this.templateInstance.model&&console.warn("Attributes on "+this.localName+" were data bound prior to Polymer upgrading the element. This may result in incorrect binding types."),this.created(),this.prepareElement(),(!this.ownerDocument.isStagingDocument||window.ShadowDOMPolyfill)&&this.makeElementReady()},prepareElement:function(){return this._elementPrepared?void console.warn("Element already prepared",this.localName):(this._elementPrepared=!0,this.shadowRoots={},this.createPropertyObserver(),this.openPropertyObserver(),this.copyInstanceAttributes(),this.takeAttributes(),void this.addHostListeners())},makeElementReady:function(){this._readied||(this._readied=!0,this.parseDeclarations(this.__proto__),this.removeAttribute("unresolved"),this.ready())},attachedCallback:function(){this.cancelUnbindAll(),this.attached&&this.attached(),this.enteredView&&this.enteredView(),this.hasBeenAttached||(this.hasBeenAttached=!0,this.domReady&&this.async("domReady"))},detachedCallback:function(){this.preventDispose||this.asyncUnbindAll(),this.detached&&this.detached(),this.leftView&&this.leftView()},enteredViewCallback:function(){this.attachedCallback()},leftViewCallback:function(){this.detachedCallback()},enteredDocumentCallback:function(){this.attachedCallback()},leftDocumentCallback:function(){this.detachedCallback()},parseDeclarations:function(a){a&&a.element&&(this.parseDeclarations(a.__proto__),a.parseDeclaration.call(this,a.element))},parseDeclaration:function(a){var b=this.fetchTemplate(a);if(b){var c=this.shadowFromTemplate(b);this.shadowRoots[a.name]=c}},fetchTemplate:function(a){return a.querySelector("template")},shadowFromTemplate:function(a){if(a){var b=this.createShadowRoot(),c=this.instanceTemplate(a);return b.appendChild(c),this.shadowRootReady(b,a),b}},lightFromTemplate:function(a,b){if(a){this.lightDomController=!0;var c=this.instanceTemplate(a);return b?this.insertBefore(c,b):this.appendChild(c),this.shadowRootReady(this),c}},shadowRootReady:function(a){this.marshalNodeReferences(a),PolymerGestures.register(a)},marshalNodeReferences:function(a){var b=this.$=this.$||{};if(a)for(var c,d=a.querySelectorAll("[id]"),e=0,f=d.length;f>e&&(c=d[e]);e++)b[c.id]=c},attributeChangedCallback:function(a){"class"!==a&&"style"!==a&&this.attributeToProperty(a,this.getAttribute(a)),this.attributeChanged&&this.attributeChanged.apply(this,arguments)},onMutation:function(a,b){var c=new MutationObserver(function(a){b.call(this,c,a),c.disconnect()}.bind(this));c.observe(a,{childList:!0,subtree:!0})}};c.prototype=d,d.constructor=c,a.Base=c,a.isBase=b,a.api.instance.base=d}(Polymer),function(a){function b(a){return a.__proto__}function c(a,b){var c="",d=!1;b&&(c=b.localName,d=b.hasAttribute("is"));var e=Platform.ShadowCSS.makeScopeSelector(c,d);return Platform.ShadowCSS.shimCssText(a,e)}var d=(window.logFlags||{},"element"),e="controller",f={STYLE_SCOPE_ATTRIBUTE:d,installControllerStyles:function(){var a=this.findStyleScope();if(a&&!this.scopeHasNamedStyle(a,this.localName)){for(var c=b(this),d="";c&&c.element;)d+=c.element.cssTextForScope(e),c=b(c);d&&this.installScopeCssText(d,a)}},installScopeStyle:function(a,b,c){var c=c||this.findStyleScope(),b=b||"";if(c&&!this.scopeHasNamedStyle(c,this.localName+b)){var d="";if(a instanceof Array)for(var e,f=0,g=a.length;g>f&&(e=a[f]);f++)d+=e.textContent+"\n\n";else d=a.textContent;this.installScopeCssText(d,c,b)}},installScopeCssText:function(a,b,d){if(b=b||this.findStyleScope(),d=d||"",b){window.ShadowDOMPolyfill&&(a=c(a,b.host));var f=this.element.cssTextToScopeStyle(a,e);Polymer.applyStyleToScope(f,b),b._scopeStyles[this.localName+d]=!0}},findStyleScope:function(a){for(var b=a||this;b.parentNode;)b=b.parentNode;return b},scopeHasNamedStyle:function(a,b){return a._scopeStyles=a._scopeStyles||{},a._scopeStyles[b]}};a.api.instance.styles=f}(Polymer),function(a){function b(a,b){if(1===arguments.length&&"string"!=typeof arguments[0]){b=a;var c=document._currentScript;if(a=c&&c.parentNode&&c.parentNode.getAttribute?c.parentNode.getAttribute("name"):"",!a)throw"Element name could not be inferred."}if(f[a])throw"Already registered (Polymer) prototype for element "+a;e(a,b),d(a)}function c(a,b){h[a]=b}function d(a){h[a]&&(h[a].registerWhenReady(),delete h[a])}function e(a,b){return i[a]=b||{}}function f(a){return i[a]}var g=a.extend,h=(a.api,{}),i={};a.getRegisteredPrototype=f,a.waitingForPrototype=c,window.Polymer=b,g(Polymer,a);var j=Platform.deliverDeclarations();if(j)for(var k,l=0,m=j.length;m>l&&(k=j[l]);l++)b.apply(null,k)}(Polymer),function(a){var b={resolveElementPaths:function(a){Platform.urlResolver.resolveDom(a)},addResolvePathApi:function(){var a=this.getAttribute("assetpath")||"",b=new URL(a,this.ownerDocument.baseURI);this.prototype.resolvePath=function(a,c){var d=new URL(a,c||b);return d.href}}};a.api.declaration.path=b}(Polymer),function(a){function b(a,b){var c=new URL(a.getAttribute("href"),b).href;return"@import '"+c+"';"}function c(a,b){if(a){b===document&&(b=document.head),window.ShadowDOMPolyfill&&(b=document.head);var c=d(a.textContent),e=a.getAttribute(h);e&&c.setAttribute(h,e);var f=b.firstElementChild;if(b===document.head){var g="style["+h+"]",i=document.head.querySelectorAll(g);i.length&&(f=i[i.length-1].nextElementSibling)}b.insertBefore(c,f)}}function d(a,b){b=b||document,b=b.createElement?b:b.ownerDocument;var c=b.createElement("style");return c.textContent=a,c}function e(a){return a&&a.__resource||""}function f(a,b){return p?p.call(a,b):void 0}var g=(window.logFlags||{},a.api.instance.styles),h=g.STYLE_SCOPE_ATTRIBUTE,i="style",j="@import",k="link[rel=stylesheet]",l="global",m="polymer-scope",n={loadStyles:function(a){var b=this.templateContent();b&&this.convertSheetsToStyles(b);var c=this.findLoadableStyles(b);c.length?Platform.styleResolver.loadStyles(c,a):a&&a()},convertSheetsToStyles:function(a){for(var c,e,f=a.querySelectorAll(k),g=0,h=f.length;h>g&&(c=f[g]);g++)e=d(b(c,this.ownerDocument.baseURI),this.ownerDocument),this.copySheetAttributes(e,c),c.parentNode.replaceChild(e,c)},copySheetAttributes:function(a,b){for(var c,d=0,e=b.attributes,f=e.length;(c=e[d])&&f>d;d++)"rel"!==c.name&&"href"!==c.name&&a.setAttribute(c.name,c.value)},findLoadableStyles:function(a){var b=[];if(a)for(var c,d=a.querySelectorAll(i),e=0,f=d.length;f>e&&(c=d[e]);e++)c.textContent.match(j)&&b.push(c);return b},installSheets:function(){this.cacheSheets(),this.cacheStyles(),this.installLocalSheets(),this.installGlobalStyles()},cacheSheets:function(){this.sheets=this.findNodes(k),this.sheets.forEach(function(a){a.parentNode&&a.parentNode.removeChild(a)})},cacheStyles:function(){this.styles=this.findNodes(i+"["+m+"]"),this.styles.forEach(function(a){a.parentNode&&a.parentNode.removeChild(a)})},installLocalSheets:function(){var a=this.sheets.filter(function(a){return!a.hasAttribute(m)}),b=this.templateContent();if(b){var c="";if(a.forEach(function(a){c+=e(a)+"\n"}),c){var f=d(c,this.ownerDocument);b.insertBefore(f,b.firstChild)}}},findNodes:function(a,b){var c=this.querySelectorAll(a).array(),d=this.templateContent();if(d){var e=d.querySelectorAll(a).array();c=c.concat(e)}return b?c.filter(b):c},installGlobalStyles:function(){var a=this.styleForScope(l);c(a,document.head)},cssTextForScope:function(a){var b="",c="["+m+"="+a+"]",d=function(a){return f(a,c)},g=this.sheets.filter(d);g.forEach(function(a){b+=e(a)+"\n\n"});var h=this.styles.filter(d);return h.forEach(function(a){b+=a.textContent+"\n\n"}),b},styleForScope:function(a){var b=this.cssTextForScope(a);return this.cssTextToScopeStyle(b,a)},cssTextToScopeStyle:function(a,b){if(a){var c=d(a);return c.setAttribute(h,this.getAttribute("name")+"-"+b),c}}},o=HTMLElement.prototype,p=o.matches||o.matchesSelector||o.webkitMatchesSelector||o.mozMatchesSelector;a.api.declaration.styles=n,a.applyStyleToScope=c}(Polymer),function(a){var b=(window.logFlags||{},a.api.instance.events),c=b.EVENT_PREFIX,d={parseHostEvents:function(){var a=this.prototype.eventDelegates;this.addAttributeDelegates(a)},addAttributeDelegates:function(a){for(var b,c=0;b=this.attributes[c];c++)this.hasEventPrefix(b.name)&&(a[this.removeEventPrefix(b.name)]=b.value.replace("{{","").replace("}}","").trim())},hasEventPrefix:function(a){return a&&"o"===a[0]&&"n"===a[1]&&"-"===a[2]},removeEventPrefix:function(a){return a.slice(e)}},e=c.length;a.api.declaration.events=d}(Polymer),function(a){var b={inferObservers:function(a){var b,c=a.observe;for(var d in a)"Changed"===d.slice(-7)&&(c||(c=a.observe={}),b=d.slice(0,-7),c[b]=c[b]||d)},explodeObservers:function(a){var b=a.observe;if(b){var c={};for(var d in b)for(var e,f=d.split(" "),g=0;e=f[g];g++)c[e]=b[d];a.observe=c}},optimizePropertyMaps:function(a){if(a.observe){var b=a._observeNames=[];for(var c in a.observe)for(var d,e=c.split(" "),f=0;d=e[f];f++)b.push(d)}if(a.publish){var b=a._publishNames=[];for(var c in a.publish)b.push(c)}},publishProperties:function(a,b){var c=a.publish;c&&(this.requireProperties(c,a,b),a._publishLC=this.lowerCaseMap(c))},requireProperties:function(a,b,c){b.reflect=b.reflect||{};for(var d in a)this.valueReflects(a[d])&&(b.reflect[d]=!0),void 0===b[d]&&void 0===c[d]&&(b[d]=this.valueForProperty(a[d]))},valueForProperty:function(a){return"object"==typeof a&&null!==a?void 0!==a.value?a.value:null:a},valueReflects:function(a){return"object"==typeof a&&null!==a&&a.reflect},lowerCaseMap:function(a){var b={};for(var c in a)b[c.toLowerCase()]=c;return b},createPropertyAccessors:function(a){var b=a._publishNames;if(b&&b.length)for(var c,d=0,e=b.length;e>d&&(c=b[d]);d++)Observer.createBindablePrototypeAccessor(a,c)}};a.api.declaration.properties=b}(Polymer),function(a){var b="attributes",c=/\s|,/,d={inheritAttributesObjects:function(a){this.inheritObject(a,"publishLC"),this.inheritObject(a,"_instanceAttributes")},publishAttributes:function(a,d){var e=this.getAttribute(b);if(e)for(var f,g=a.publish||(a.publish={}),h=e.split(c),i=0,j=h.length;j>i;i++)f=h[i].trim(),f&&void 0===g[f]&&void 0===d[f]&&(g[f]=null)},accumulateInstanceAttributes:function(){for(var a,b=this.prototype._instanceAttributes,c=this.attributes,d=0,e=c.length;e>d&&(a=c[d]);d++)this.isInstanceAttribute(a.name)&&(b[a.name]=a.value)},isInstanceAttribute:function(a){return!this.blackList[a]&&"on-"!==a.slice(0,3)},blackList:{name:1,"extends":1,constructor:1,noscript:1,assetpath:1,"cache-csstext":1}};d.blackList[b]=1,a.api.declaration.attributes=d}(Polymer),function(a){function b(a){for(;a.parentNode;){if(a.lightDomController)return a;a=a.parentNode}return a.host}var c=new PolymerExpressions;c.resolveEventHandler=function(a,c,d){var e=b(d);if(e){var f=c.getValueFrom(e);if(f)return f.bind(e)}};var d={syntax:c,fetchTemplate:function(){return this.querySelector("template")},templateContent:function(){var a=this.fetchTemplate();return a&&templateContent(a)},installBindingDelegate:function(a){a&&(a.bindingDelegate=this.syntax)}};a.api.declaration.mdv=d}(Polymer),function(a){function b(a){if(!Object.__proto__){var b=Object.getPrototypeOf(a);a.__proto__=b,d(b)&&(b.__proto__=Object.getPrototypeOf(b))}}var c=a.api,d=a.isBase,e=a.extend,f={register:function(a,b){this.buildPrototype(a,b),this.registerPrototype(a,b),this.publishConstructor()},buildPrototype:function(b,c){var d=a.getRegisteredPrototype(b),e=this.generateBasePrototype(c);this.desugarBeforeChaining(d,e),this.prototype=this.chainPrototypes(d,e),this.desugarAfterChaining(b,c)},desugarBeforeChaining:function(a,b){a.element=this,this.publishAttributes(a,b),this.publishProperties(a,b),this.inferObservers(a),this.explodeObservers(a)},chainPrototypes:function(a,c){this.inheritMetaData(a,c);var d=this.chainObject(a,c);return b(d),d},inheritMetaData:function(a,b){this.inheritObject("observe",a,b),this.inheritObject("publish",a,b),this.inheritObject("reflect",a,b),this.inheritObject("_publishLC",a,b),this.inheritObject("_instanceAttributes",a,b),this.inheritObject("eventDelegates",a,b)},desugarAfterChaining:function(a,b){this.optimizePropertyMaps(this.prototype),this.createPropertyAccessors(this.prototype),this.installBindingDelegate(this.fetchTemplate()),this.installSheets(),this.resolveElementPaths(this),this.accumulateInstanceAttributes(),this.parseHostEvents(),this.addResolvePathApi(),window.ShadowDOMPolyfill&&Platform.ShadowCSS.shimStyling(this.templateContent(),a,b),this.prototype.registerCallback&&this.prototype.registerCallback(this)},publishConstructor:function(){var a=this.getAttribute("constructor");a&&(window[a]=this.ctor)},generateBasePrototype:function(a){var b=this.findBasePrototype(a);if(!b){var b=HTMLElement.getPrototypeForTag(a);b=this.ensureBaseApi(b),g[a]=b}return b},findBasePrototype:function(a){return g[a]},ensureBaseApi:function(a){if(a.PolymerBase)return a;var b=Object.create(a);return c.publish(c.instance,b),this.mixinMethod(b,a,c.instance.mdv,"bind"),b},mixinMethod:function(a,b,c,d){var e=function(a){return b[d].apply(this,a)};a[d]=function(){return this.mixinSuper=e,c[d].apply(this,arguments)}},inheritObject:function(a,b,c){var d=b[a]||{};b[a]=this.chainObject(d,c[a])},registerPrototype:function(a,b){var c={prototype:this.prototype},d=this.findTypeExtension(b);d&&(c.extends=d),HTMLElement.register(a,this.prototype),this.ctor=document.registerElement(a,c)},findTypeExtension:function(a){if(a&&a.indexOf("-")<0)return a;var b=this.findBasePrototype(a);return b.element?this.findTypeExtension(b.element.extends):void 0}},g={};f.chainObject=Object.__proto__?function(a,b){return a&&b&&a!==b&&(a.__proto__=b),a}:function(a,b){if(a&&b&&a!==b){var c=Object.create(b);a=e(c,a)}return a},c.declaration.prototype=f}(Polymer),function(a){function b(a){return document.contains(a)?g:f}function c(){return f.length?f[0]:g[0]}function d(a){e.waitToReady=!0,CustomElements.ready=!1,HTMLImports.whenImportsReady(function(){e.addReadyCallback(a),e.waitToReady=!1,e.check()})}var e={wait:function(a,b,c){return-1===this.indexOf(a)&&(this.add(a),a.__check=b,a.__go=c),0!==this.indexOf(a)},add:function(a){b(a).push(a)},indexOf:function(a){var c=b(a).indexOf(a);return c>=0&&document.contains(a)&&(c+=HTMLImports.useNative||HTMLImports.ready?f.length:1e9),c},go:function(a){var b=this.remove(a);b&&(b.__go.call(b),b.__check=b.__go=null,this.check())},remove:function(a){var c=this.indexOf(a);if(0===c)return b(a).shift()},check:function(){var a=this.nextElement();return a&&a.__check.call(a),this.canReady()?(this.ready(),!0):void 0},nextElement:function(){return c()},canReady:function(){return!this.waitToReady&&this.isEmpty()},isEmpty:function(){return!f.length&&!g.length},ready:function(){if(CustomElements.ready===!1&&(CustomElements.upgradeDocumentTree(document),CustomElements.ready=!0),h)for(var a;h.length;)(a=h.shift())()},addReadyCallback:function(a){a&&h.push(a)},waitToReady:!0},f=[],g=[],h=[];document.addEventListener("WebComponentsReady",function(){CustomElements.ready=!1}),a.queue=e,a.whenPolymerReady=d}(Polymer),function(a){function b(a,b){a?(document.head.appendChild(a),d(b)):b&&b()}function c(a,c){if(a&&a.length){for(var d,e,f=document.createDocumentFragment(),g=0,h=a.length;h>g&&(d=a[g]);g++)e=document.createElement("link"),e.rel="import",e.href=d,f.appendChild(e);b(f,c)}else c&&c()}var d=a.whenPolymerReady;a.import=c,a.importElements=b}(Polymer),function(a){function b(a){return Boolean(HTMLElement.getPrototypeForTag(a))}function c(a){return a&&a.indexOf("-")>=0}var d=a.extend,e=a.api,f=a.queue,g=a.whenPolymerReady,h=a.getRegisteredPrototype,i=a.waitingForPrototype,j=d(Object.create(HTMLElement.prototype),{createdCallback:function(){this.getAttribute("name")&&this.init()},init:function(){this.name=this.getAttribute("name"),this.extends=this.getAttribute("extends"),this.loadResources(),this.registerWhenReady()},registerWhenReady:function(){this.registered||this.waitingForPrototype(this.name)||this.waitingForQueue()||this.waitingForResources()||f.go(this)},_register:function(){c(this.extends)&&!b(this.extends)&&console.warn("%s is attempting to extend %s, an unregistered element or one that was not registered with Polymer.",this.name,this.extends),this.register(this.name,this.extends),this.registered=!0},waitingForPrototype:function(a){return h(a)?void 0:(i(a,this),this.handleNoScript(a),!0)},handleNoScript:function(a){if(this.hasAttribute("noscript")&&!this.noscript)if(this.noscript=!0,window.CustomElements&&!CustomElements.useNative)Polymer(a);else{var b=document.createElement("script");b.textContent="Polymer('"+a+"');",this.appendChild(b)}},waitingForResources:function(){return this._needsResources},waitingForQueue:function(){return f.wait(this,this.registerWhenReady,this._register)},loadResources:function(){this._needsResources=!0,this.loadStyles(function(){this._needsResources=!1,this.registerWhenReady()}.bind(this))}});e.publish(e.declaration,j),g(function(){document.body.removeAttribute("unresolved"),document.dispatchEvent(new CustomEvent("polymer-ready",{bubbles:!0}))}),document.registerElement("polymer-element",{prototype:j})}(Polymer);
+//# sourceMappingURL=polymer.js.map
\ No newline at end of file
diff --git a/examples/pipetobrowser/browser/libs/vendor/polymer/polymer/polymer.js.map b/examples/pipetobrowser/browser/libs/vendor/polymer/polymer/polymer.js.map
new file mode 100644
index 0000000..bf3d54d
--- /dev/null
+++ b/examples/pipetobrowser/browser/libs/vendor/polymer/polymer/polymer.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"polymer.js","sources":["../../polymer-gestures/src/scope.js","../../polymer-gestures/src/targetfind.js","../../polymer-gestures/src/touch-action.js","../../polymer-gestures/src/eventFactory.js","../../polymer-gestures/src/pointermap.js","../../polymer-gestures/src/dispatcher.js","../../polymer-gestures/src/installer.js","../../polymer-gestures/src/mouse.js","../../polymer-gestures/src/touch.js","../../polymer-gestures/src/ms.js","../../polymer-gestures/src/pointer.js","../../polymer-gestures/src/platform-events.js","../../polymer-gestures/src/track.js","../../polymer-gestures/src/tap.js","../../polymer-expressions/third_party/esprima/esprima.js","../../polymer-expressions/src/polymer-expressions.js","../src/polymer.js","../src/boot.js","../src/lib/lang.js","../src/lib/job.js","../src/lib/dom.js","../src/lib/super.js","../src/lib/deserialize.js","../src/api.js","../src/instance/utils.js","../src/instance/events.js","../src/instance/attributes.js","../src/instance/properties.js","../src/instance/mdv.js","../src/instance/base.js","../src/instance/styles.js","../src/declaration/polymer.js","../src/declaration/path.js","../src/declaration/styles.js","../src/declaration/events.js","../src/declaration/properties.js","../src/declaration/attributes.js","../src/declaration/mdv.js","../src/declaration/prototype.js","../src/declaration/queue.js","../src/declaration/import.js","../src/declaration/polymer-element.js"],"names":["window","PolymerGestures","scope","target","shadow","inEl","shadowRoot","webkitShadowRoot","canTarget","Boolean","elementFromPoint","targetingShadow","s","this","olderShadow","os","olderShadowRoot","se","querySelector","allShadows","element","shadows","push","searchRoot","inRoot","x","y","st","sr","t","ssr","owner","document","parentNode","nodeType","Node","DOCUMENT_NODE","DOCUMENT_FRAGMENT_NODE","findTarget","inEvent","clientX","clientY","LCA","a","b","contains","adepth","depth","bdepth","d","walk","n","u","i","host","deepContains","common","insideNode","node","rect","getBoundingClientRect","left","right","top","bottom","targetFinding","bind","shadowSelector","v","selector","rule","attrib2css","selectors","styles","hasTouchAction","head","style","touchAction","hasShadowRoot","ShadowDOMPolyfill","createShadowRoot","forEach","r","String","map","el","createElement","textContent","appendChild","MOUSE_PROPS","MOUSE_DEFAULTS","NOP_FACTORY","eventFactory","preventTap","makeBaseEvent","inType","inDict","e","createEvent","initEvent","bubbles","cancelable","makeGestureEvent","Object","create","k","keys","length","makePointerEvent","p","buttons","pressure","pointerId","width","height","tiltX","tiltY","pointerType","hwTimestamp","isPrimary","PointerMap","USE_MAP","m","Map","pointers","POINTERS_FN","values","prototype","size","set","inId","indexOf","has","delete","splice","get","clear","callback","thisArg","call","CLONE_PROPS","CLONE_DEFAULTS","HAS_SVG_INSTANCE","SVGElementInstance","dispatcher","pointermap","eventMap","eventSources","eventSourceList","gestures","gestureQueue","registerSource","name","source","newEvents","events","registerGesture","register","es","l","unregister","down","fireEvent","move","type","fillGestureQueue","up","eventHandler","_handledByPG","fn","listen","addEvent","unlisten","removeEvent","eventName","addEventListener","boundHandler","removeEventListener","makeEvent","preventDefault","_target","dispatchEvent","cloneEvent","eventCopy","correspondingUseElement","clone","gestureTrigger","g","j","ev","requestAnimationFrame","boundGestureTrigger","Installer","add","remove","changed","binder","addCallback","removeCallback","changedCallback","MO","observer","mutationWatcher","Array","toArray","slice","filter","MutationObserver","WebKitMutationObserver","SELECTOR","OBSERVER_INIT","subtree","childList","attributes","attributeOldValue","attributeFilter","watchSubtree","observe","enableOnSubtree","readyState","installOnLoad","installNewSubtree","findElements","addElement","querySelectorAll","removeElement","elementChanged","oldValue","concatLists","accum","list","concat","isElement","ELEMENT_NODE","flattenMutationTree","inNodes","tree","reduce","mutations","mutationHandler","added","addedNodes","removed","removedNodes","console","warn","DEDUP_DIST","WHICH_TO_BUTTONS","HAS_BUTTONS","MouseEvent","mouseEvents","POINTER_ID","POINTER_TYPE","lastTouches","isEventSimulatedFromTouch","lts","dx","Math","abs","dy","prepareEvent","which","mousedown","mouseup","mousemove","relatedTarget","cleanupMouse","INSTALLER","DEDUP_TIMEOUT","CLICK_COUNT_TIMEOUT","ATTRIB","HAS_TOUCH_ACTION","touchEvents","elementAdded","getAttribute","touchActionToScrollType","_scrollType","elementRemoved","undefined","oldSt","scrollTypes","EMITTER","XSCROLLER","YSCROLLER","SCROLLER","exec","firstTouch","isPrimaryTouch","inTouch","identifier","setPrimaryTouch","firstXY","X","Y","scrolling","cancelResetClickCount","removePrimaryPointer","inPointer","resetClickCount","clickCount","resetId","setTimeout","clearTimeout","typeToButtons","ret","touch","id","currentTouchEvent","touchToPointer","cte","detail","webkitRadiusX","radiusX","webkitRadiusY","radiusY","webkitForce","force","self","processTouches","inFunction","tl","changedTouches","shouldScroll","scrollAxis","currentTarget","oa","da","doa","findTouch","inTL","vacuumTouches","touches","value","key","out","cancelOut","touchstart","dedupSynthMouse","touchmove","touchcancel","pointer","touchend","cleanUpPointer","lt","HAS_BITMAP_TYPE","MSPointerEvent","MSPOINTER_TYPE_MOUSE","msEvents","POINTER_TYPES","cleanup","MSPointerDown","MSPointerMove","MSPointerUp","MSPointerCancel","pointerEvents","pointerdown","pointermove","pointerup","pointercancel","PointerEvent","navigator","msPointerEnabled","ontouchstart","track","WIGGLE_THRESHOLD","clampDir","inDelta","calcPositionDelta","inA","inB","pageX","pageY","fireTrack","inTrackingData","downEvent","dd","lastMoveEvent","xDirection","yDirection","ddx","ddy","screenX","screenY","trackInfo","downTarget","tracking","tap","tapPrevented","shouldTap","downState","start","altKey","ctrlKey","metaKey","shiftKey","global","assert","condition","message","Error","isDecimalDigit","ch","isWhiteSpace","fromCharCode","isLineTerminator","isIdentifierStart","isIdentifierPart","isKeyword","skipWhitespace","index","charCodeAt","getIdentifier","scanIdentifier","Token","Identifier","Keyword","NullLiteral","BooleanLiteral","range","scanPunctuator","code2","ch2","code","ch1","Punctuator","throwError","Messages","UnexpectedToken","scanNumericLiteral","number","NumericLiteral","parseFloat","scanStringLiteral","quote","str","octal","StringLiteral","isIdentifierName","token","advance","EOF","lex","lookahead","peek","pos","messageFormat","error","args","arguments","msg","replace","whole","description","throwUnexpected","expect","match","matchKeyword","keyword","parseArrayInitialiser","elements","parseExpression","delegate","createArrayExpression","parseObjectPropertyKey","createLiteral","createIdentifier","parseObjectProperty","createProperty","parseObjectInitialiser","properties","createObjectExpression","parseGroupExpression","expr","parsePrimaryExpression","createThisExpression","parseArguments","parseNonComputedProperty","parseNonComputedMember","parseComputedMember","parseLeftHandSideExpression","property","createMemberExpression","parseUnaryExpression","parsePostfixExpression","createUnaryExpression","binaryPrecedence","prec","parseBinaryExpression","stack","operator","pop","createBinaryExpression","parseConditionalExpression","consequent","alternate","createConditionalExpression","parseFilter","createFilter","parseFilters","parseTopLevel","Syntax","parseInExpression","parseAsExpression","createTopLevel","createAsExpression","indexName","createInExpression","parse","inDelegate","state","labelSet","TokenName","ArrayExpression","BinaryExpression","CallExpression","ConditionalExpression","EmptyStatement","ExpressionStatement","Literal","LabeledStatement","LogicalExpression","MemberExpression","ObjectExpression","Program","Property","ThisExpression","UnaryExpression","UnknownLabel","Redeclaration","esprima","prepareBinding","expressionText","filterRegistry","expression","getExpression","scopeIdent","tagName","ex","model","oneTime","binding","getBinding","polymerExpressionScopeIdent_","indexIdent","polymerExpressionIndexIdent_","expressionParseCache","ASTDelegate","Expression","valueFn_","IdentPath","path","Path","object","accessor","valid","dynamicDeps","dynamic","simplePath","getFn","Filter","notImplemented","arg","valueFn","filters","deps","currentPath","ConstantObservable","value_","convertStylePropertyName","c","toLowerCase","isEventHandler","findScope","prop","parentScopeName","hasOwnProperty","resolveEventReceiver","prepareEventBinding","polymerExpressions","eventType","substring","mixedCaseEventTypes","bindingValue","receiver","handler","resolveEventHandler","Platform","flush","getValueFrom","apply","open","discardChanges","close","isLiteralExpression","pathString","isNaN","Number","PolymerExpressions","addPath","setValue","newValue","setValueFrom",{"end":{"file":"../../polymer-expressions/src/polymer-expressions.js","comments_before":[],"nlb":false,"endpos":4597,"pos":4589,"col":8,"line":145,"value":"fullPath","type":"name"},"start":{"file":"../../polymer-expressions/src/polymer-expressions.js","comments_before":[],"nlb":false,"endpos":4597,"pos":4589,"col":8,"line":145,"value":"fullPath","type":"name"},"name":"fullPath"},"fullPath","fullPath_","last","context","propName","transform","toModelDirection","toModel","toDOM","unaryOperators","+","-","!","binaryOperators","*","/","%","<",">","<=",">=","==","!=","===","!==","&&","||","op","argument","test","ident","arr","kind","obj","deliver","firstTime","firstValue","startReset","getValue","finishReset","setValueFn","CompoundObserver","ObserverTransform","count","random","toString","styleObject","parts","join","tokenList","tokens","prepareInstancePositionChanged","template","templateInstance","PathObserver","prepareInstanceModel","scopeName","parentScope","exposeGetExpression","getExpression_","Polymer","extend","api","getOwnPropertyNames","pd","getOwnPropertyDescriptor","defineProperty","nom","job","wait","stop","Job","go","inContext","boundComplete","complete","h","handle","cancelAnimationFrame","registry","HTMLElement","tag","getPrototypeForTag","getPrototypeOf","originalStopPropagation","Event","stopPropagation","cancelBubble","$super","arrayOfArgs","caller","_super","nameInThis","memoizeSuper","nextSuper","proto","method","__proto__","n$","super","deserializeValue","currentValue","inferredType","Date","typeHandlers","string","date","now","boolean","parseInt","JSON","function","declaration","instance","publish","apis","utils","async","timeout","cancelAsync","fire","onNode","event","CustomEvent","asyncFire","classFollows","anew","old","className","classList","nop","nob","asyncMethod","log","logFlags","EVENT_PREFIX","addHostListeners","eventDelegates","localName","bindable","dispatchMethod","group","groupEnd","copyInstanceAttributes","a$","_instanceAttributes","hasAttribute","setAttribute","takeAttributes","_publishLC","attributeToProperty","propertyForAttribute","search","bindPattern","stringValue","serializeValue","reflectPropertyToAttribute","serializedValue","removeAttribute","bindProperties","inProperty","observable","LOG_BIND_PROPS","path_","inPath","Observer","bindToInstance","resolveBindingValue","createPropertyObserver","_observeNames","o","_propertyObserver","registerObservers","observeArrayValue","openPropertyObserver","notifyPropertyChanges","newValues","oldValues","paths","called","invokeMethod","propertyChanged_","reflect","callbackName","isArray","closeNamedObserver","ArrayObserver","registerNamedObserver","bindProperty","observers","_observers","closeObservers","closeObserverArray","observerArray","o$","_namedObservers","closeNamedObservers","mdv","instanceTemplate","syntax","bindingDelegate","dom","createInstance","bindings_","enableBindingsReflection","mixinSuper","bindFinished","makeElementReady","asyncUnbindAll","_unbound","unbind","_unbindAllJob","unbindAll","cancelUnbindAll","mustachePattern","isBase","PolymerBase","base","created","ready","createdCallback","prepareElement","ownerDocument","isStagingDocument","_elementPrepared","shadowRoots","_readied","parseDeclarations","attachedCallback","attached","enteredView","hasBeenAttached","domReady","detachedCallback","preventDispose","detached","leftView","enteredViewCallback","leftViewCallback","enteredDocumentCallback","leftDocumentCallback","parseDeclaration","elementElement","fetchTemplate","root","shadowFromTemplate","shadowRootReady","lightFromTemplate","refNode","lightDomController","insertBefore","marshalNodeReferences","$","attributeChangedCallback","attributeChanged","onMutation","listener","disconnect","constructor","Base","shimCssText","cssText","is","ShadowCSS","makeScopeSelector","STYLE_SCOPE_ATTRIBUTE","STYLE_CONTROLLER_SCOPE","installControllerStyles","findStyleScope","scopeHasNamedStyle","cssTextForScope","installScopeCssText","installScopeStyle","cssTextToScopeStyle","applyStyleToScope","_scopeStyles","script","_currentScript","getRegisteredPrototype","registerPrototype","notifyPrototype","waitingForPrototype","client","waitPrototype","registerWhenReady","prototypesByName","declarations","deliverDeclarations","resolveElementPaths","urlResolver","resolveDom","addResolvePathApi","assetPath","URL","baseURI","resolvePath","urlPath","href","importRuleForSheet","sheet","baseUrl","createStyleElement","attr","firstElementChild","s$","nextElementSibling","cssTextFromSheet","__resource","matchesSelector","inSelector","matches","STYLE_SELECTOR","STYLE_LOADABLE_MATCH","SHEET_SELECTOR","STYLE_GLOBAL_SCOPE","SCOPE_ATTR","loadStyles","content","templateContent","convertSheetsToStyles","findLoadableStyles","styleResolver","copySheetAttributes","replaceChild","link","loadables","installSheets","cacheSheets","cacheStyles","installLocalSheets","installGlobalStyles","sheets","findNodes","removeChild","firstChild","matcher","nodes","array","templateNodes","styleForScope","scopeDescriptor","webkitMatchesSelector","mozMatchesSelector","parseHostEvents","delegates","addAttributeDelegates","hasEventPrefix","removeEventPrefix","trim","prefixLength","inferObservers","explodeObservers","exploded","ni","names","split","optimizePropertyMaps","_publishNames","publishProperties","requireProperties","lowerCaseMap","valueReflects","valueForProperty","propertyValue","createPropertyAccessors","createBindablePrototypeAccessor","ATTRIBUTES_ATTRIBUTE","ATTRIBUTES_REGEX","inheritAttributesObjects","inheritObject","publishAttributes","accumulateInstanceAttributes","clonable","isInstanceAttribute","blackList","extends","noscript","assetpath","cache-csstext","findEventController","ctlr","installBindingDelegate","ensurePrototypeTraversal","ancestor","extendeeName","buildPrototype","publishConstructor","extension","generateBasePrototype","desugarBeforeChaining","chainPrototypes","desugarAfterChaining","inheritMetaData","chained","chainObject","extendee","shimStyling","registerCallback","symbol","ctor","extnds","findBasePrototype","ensureBaseApi","memoizedBases","extended","mixinMethod","info","typeExtension","findTypeExtension","registerElement","inherited","queueForElement","mainQueue","importQueue","nextQueued","whenPolymerReady","queue","waitToReady","CustomElements","HTMLImports","whenImportsReady","addReadyCallback","check","__check","__go","useNative","readied","shift","nextElement","canReady","isEmpty","upgradeDocumentTree","readyCallbacks","importElements","elementOrFragment","importUrls","urls","url","frag","createDocumentFragment","rel","import","isRegistered","isCustomTag","init","loadResources","registered","waitingForQueue","waitingForResources","_register","handleNoScript","_needsResources","body"],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\nwindow.PolymerGestures = {};\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var target = {\n    shadow: function(inEl) {\n      if (inEl) {\n        return inEl.shadowRoot || inEl.webkitShadowRoot;\n      }\n    },\n    canTarget: function(shadow) {\n      return shadow && Boolean(shadow.elementFromPoint);\n    },\n    targetingShadow: function(inEl) {\n      var s = this.shadow(inEl);\n      if (this.canTarget(s)) {\n        return s;\n      }\n    },\n    olderShadow: function(shadow) {\n      var os = shadow.olderShadowRoot;\n      if (!os) {\n        var se = shadow.querySelector('shadow');\n        if (se) {\n          os = se.olderShadowRoot;\n        }\n      }\n      return os;\n    },\n    allShadows: function(element) {\n      var shadows = [], s = this.shadow(element);\n      while(s) {\n        shadows.push(s);\n        s = this.olderShadow(s);\n      }\n      return shadows;\n    },\n    searchRoot: function(inRoot, x, y) {\n      if (inRoot) {\n        var t = inRoot.elementFromPoint(x, y);\n        var st, sr, os;\n        // is element a shadow host?\n        sr = this.targetingShadow(t);\n        while (sr) {\n          // find the the element inside the shadow root\n          st = sr.elementFromPoint(x, y);\n          if (!st) {\n            // check for older shadows\n            sr = this.olderShadow(sr);\n          } else {\n            // shadowed element may contain a shadow root\n            var ssr = this.targetingShadow(st);\n            return this.searchRoot(ssr, x, y) || st;\n          }\n        }\n        // light dom element is the target\n        return t;\n      }\n    },\n    owner: function(element) {\n      if (!element) {\n        return document;\n      }\n      var s = element;\n      // walk up until you hit the shadow root or document\n      while (s.parentNode) {\n        s = s.parentNode;\n      }\n      // the owner element is expected to be a Document or ShadowRoot\n      if (s.nodeType != Node.DOCUMENT_NODE && s.nodeType != Node.DOCUMENT_FRAGMENT_NODE) {\n        s = document;\n      }\n      return s;\n    },\n    findTarget: function(inEvent) {\n      var x = inEvent.clientX, y = inEvent.clientY;\n      // if the listener is in the shadow root, it is much faster to start there\n      var s = this.owner(inEvent.target);\n      // if x, y is not in this root, fall back to document search\n      if (!s.elementFromPoint(x, y)) {\n        s = document;\n      }\n      return this.searchRoot(s, x, y);\n    },\n    LCA: function(a, b) {\n      if (a === b) {\n        return a;\n      }\n      // fast case, a is a direct descendant of b or vice versa\n      if (a.contains) {\n        if (a.contains(b)) {\n          return a;\n        }\n        if (b.contains(a)) {\n          return b;\n        }\n      }\n      var adepth = this.depth(a);\n      var bdepth = this.depth(b);\n      var d = adepth - bdepth;\n      if (d > 0) {\n        a = this.walk(a, d);\n      } else {\n        b = this.walk(b, -d);\n      }\n      while(a && b && a !== b) {\n        a = this.walk(a, 1);\n        b = this.walk(b, 1);\n      }\n      return a;\n    },\n    walk: function(n, u) {\n      for (var i = 0; n && (i < u); i++) {\n        n = n.parentNode || n.host;\n      }\n      return n;\n    },\n    depth: function(n) {\n      var d = 0;\n      while(n) {\n        d++;\n        n = n.parentNode || n.host;\n      }\n      return d;\n    },\n    deepContains: function(a, b) {\n      var common = this.LCA(a, b);\n      // if a is the common ancestor, it must \"deeply\" contain b\n      return common === a;\n    },\n    insideNode: function(node, x, y) {\n      var rect = node.getBoundingClientRect();\n      return (rect.left <= x) && (x <= rect.right) && (rect.top <= y) && (y <= rect.bottom);\n    }\n  };\n  scope.targetFinding = target;\n  /**\n   * Given an event, finds the \"deepest\" node that could have been the original target before ShadowDOM retargetting\n   *\n   * @param {Event} Event An event object with clientX and clientY properties\n   * @return {Element} The probable event origninator\n   */\n  scope.findTarget = target.findTarget.bind(target);\n  /**\n   * Determines if the \"container\" node deeply contains the \"containee\" node, including situations where the \"containee\" is contained by one or more ShadowDOM\n   * roots.\n   *\n   * @param {Node} container\n   * @param {Node} containee\n   * @return {Boolean}\n   */\n  scope.deepContains = target.deepContains.bind(target);\n\n  /**\n   * Determines if the x/y position is inside the given node.\n   *\n   * Example:\n   *\n   *     function upHandler(event) {\n   *       var innode = PolymerGestures.insideNode(event.target, event.clientX, event.clientY);\n   *       if (innode) {\n   *         // wait for tap?\n   *       } else {\n   *         // tap will never happen\n   *       }\n   *     }\n   *\n   * @param {Node} node\n   * @param {Number} x Screen X position\n   * @param {Number} y screen Y position\n   * @return {Boolean}\n   */\n  scope.insideNode = target.insideNode;\n\n})(window.PolymerGestures);\n","/*\n *\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function() {\n  function shadowSelector(v) {\n    return 'body /deep/ ' + selector(v);\n  }\n  function selector(v) {\n    return '[touch-action=\"' + v + '\"]';\n  }\n  function rule(v) {\n    return '{ -ms-touch-action: ' + v + '; touch-action: ' + v + ';}';\n  }\n  var attrib2css = [\n    'none',\n    'auto',\n    'pan-x',\n    'pan-y',\n    {\n      rule: 'pan-x pan-y',\n      selectors: [\n        'pan-x pan-y',\n        'pan-y pan-x'\n      ]\n    }\n  ];\n  var styles = '';\n  // only install stylesheet if the browser has touch action support\n  var head = document.head;\n  var hasTouchAction = typeof document.head.style.touchAction === 'string';\n  // only add shadow selectors if shadowdom is supported\n  var hasShadowRoot = !window.ShadowDOMPolyfill && document.head.createShadowRoot;\n\n  if (hasTouchAction) {\n    attrib2css.forEach(function(r) {\n      if (String(r) === r) {\n        styles += selector(r) + rule(r) + '\\n';\n        if (hasShadowRoot) {\n          styles += shadowSelector(r) + rule(r) + '\\n';\n        }\n      } else {\n        styles += r.selectors.map(selector) + rule(r.rule) + '\\n';\n        if (hasShadowRoot) {\n          styles += r.selectors.map(shadowSelector) + rule(r.rule) + '\\n';\n        }\n      }\n    });\n\n    var el = document.createElement('style');\n    el.textContent = styles;\n    document.head.appendChild(el);\n  }\n})();\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This is the constructor for new PointerEvents.\n *\n * New Pointer Events must be given a type, and an optional dictionary of\n * initialization properties.\n *\n * Due to certain platform requirements, events returned from the constructor\n * identify as MouseEvents.\n *\n * @constructor\n * @param {String} inType The type of the event to create.\n * @param {Object} [inDict] An optional dictionary of initial event properties.\n * @return {Event} A new PointerEvent of type `inType` and initialized with properties from `inDict`.\n */\n(function(scope) {\n\n  var MOUSE_PROPS = [\n    'bubbles',\n    'cancelable',\n    'view',\n    'detail',\n    'screenX',\n    'screenY',\n    'clientX',\n    'clientY',\n    'ctrlKey',\n    'altKey',\n    'shiftKey',\n    'metaKey',\n    'button',\n    'relatedTarget',\n    'pageX',\n    'pageY'\n  ];\n\n  var MOUSE_DEFAULTS = [\n    false,\n    false,\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    false,\n    false,\n    false,\n    false,\n    0,\n    null,\n    0,\n    0\n  ];\n\n  var NOP_FACTORY = function(){ return function(){}; };\n\n  var eventFactory = {\n    // TODO(dfreedm): this is overridden by tap recognizer, needs review\n    preventTap: NOP_FACTORY,\n    makeBaseEvent: function(inType, inDict) {\n      var e = document.createEvent('Event');\n      e.initEvent(inType, inDict.bubbles || false, inDict.cancelable || false);\n      e.preventTap = eventFactory.preventTap(e);\n      return e;\n    },\n    makeGestureEvent: function(inType, inDict) {\n      inDict = inDict || Object.create(null);\n\n      var e = this.makeBaseEvent(inType, inDict);\n      for (var i = 0, keys = Object.keys(inDict), k; i < keys.length; i++) {\n        k = keys[i];\n        e[k] = inDict[k];\n      }\n      return e;\n    },\n    makePointerEvent: function(inType, inDict) {\n      inDict = inDict || Object.create(null);\n\n      var e = this.makeBaseEvent(inType, inDict);\n      // define inherited MouseEvent properties\n      for(var i = 0, p; i < MOUSE_PROPS.length; i++) {\n        p = MOUSE_PROPS[i];\n        e[p] = inDict[p] || MOUSE_DEFAULTS[i];\n      }\n      e.buttons = inDict.buttons || 0;\n\n      // Spec requires that pointers without pressure specified use 0.5 for down\n      // state and 0 for up state.\n      var pressure = 0;\n      if (inDict.pressure) {\n        pressure = inDict.pressure;\n      } else {\n        pressure = e.buttons ? 0.5 : 0;\n      }\n\n      // add x/y properties aliased to clientX/Y\n      e.x = e.clientX;\n      e.y = e.clientY;\n\n      // define the properties of the PointerEvent interface\n      e.pointerId = inDict.pointerId || 0;\n      e.width = inDict.width || 0;\n      e.height = inDict.height || 0;\n      e.pressure = pressure;\n      e.tiltX = inDict.tiltX || 0;\n      e.tiltY = inDict.tiltY || 0;\n      e.pointerType = inDict.pointerType || '';\n      e.hwTimestamp = inDict.hwTimestamp || 0;\n      e.isPrimary = inDict.isPrimary || false;\n      return e;\n    }\n  };\n\n  scope.eventFactory = eventFactory;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This module implements an map of pointer states\n */\n(function(scope) {\n  var USE_MAP = window.Map && window.Map.prototype.forEach;\n  var POINTERS_FN = function(){ return this.size; };\n  function PointerMap() {\n    if (USE_MAP) {\n      var m = new Map();\n      m.pointers = POINTERS_FN;\n      return m;\n    } else {\n      this.keys = [];\n      this.values = [];\n    }\n  }\n\n  PointerMap.prototype = {\n    set: function(inId, inEvent) {\n      var i = this.keys.indexOf(inId);\n      if (i > -1) {\n        this.values[i] = inEvent;\n      } else {\n        this.keys.push(inId);\n        this.values.push(inEvent);\n      }\n    },\n    has: function(inId) {\n      return this.keys.indexOf(inId) > -1;\n    },\n    'delete': function(inId) {\n      var i = this.keys.indexOf(inId);\n      if (i > -1) {\n        this.keys.splice(i, 1);\n        this.values.splice(i, 1);\n      }\n    },\n    get: function(inId) {\n      var i = this.keys.indexOf(inId);\n      return this.values[i];\n    },\n    clear: function() {\n      this.keys.length = 0;\n      this.values.length = 0;\n    },\n    // return value, key, map\n    forEach: function(callback, thisArg) {\n      this.values.forEach(function(v, i) {\n        callback.call(thisArg, v, this.keys[i], this);\n      }, this);\n    },\n    pointers: function() {\n      return this.keys.length;\n    }\n  };\n\n  scope.PointerMap = PointerMap;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var CLONE_PROPS = [\n    // MouseEvent\n    'bubbles',\n    'cancelable',\n    'view',\n    'detail',\n    'screenX',\n    'screenY',\n    'clientX',\n    'clientY',\n    'ctrlKey',\n    'altKey',\n    'shiftKey',\n    'metaKey',\n    'button',\n    'relatedTarget',\n    // DOM Level 3\n    'buttons',\n    // PointerEvent\n    'pointerId',\n    'width',\n    'height',\n    'pressure',\n    'tiltX',\n    'tiltY',\n    'pointerType',\n    'hwTimestamp',\n    'isPrimary',\n    // event instance\n    'type',\n    'target',\n    'currentTarget',\n    'which',\n    'pageX',\n    'pageY',\n    'timeStamp',\n    // gesture addons\n    'preventTap',\n    'tapPrevented'\n  ];\n\n  var CLONE_DEFAULTS = [\n    // MouseEvent\n    false,\n    false,\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    false,\n    false,\n    false,\n    false,\n    0,\n    null,\n    // DOM Level 3\n    0,\n    // PointerEvent\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    '',\n    0,\n    false,\n    // event instance\n    '',\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    function(){},\n    false\n  ];\n\n  var HAS_SVG_INSTANCE = (typeof SVGElementInstance !== 'undefined');\n\n  var eventFactory = scope.eventFactory;\n  /**\n   * This module is for normalizing events. Mouse and Touch events will be\n   * collected here, and fire PointerEvents that have the same semantics, no\n   * matter the source.\n   * Events fired:\n   *   - pointerdown: a pointing is added\n   *   - pointerup: a pointer is removed\n   *   - pointermove: a pointer is moved\n   *   - pointerover: a pointer crosses into an element\n   *   - pointerout: a pointer leaves an element\n   *   - pointercancel: a pointer will no longer generate events\n   */\n  var dispatcher = {\n    pointermap: new scope.PointerMap(),\n    eventMap: Object.create(null),\n    // Scope objects for native events.\n    // This exists for ease of testing.\n    eventSources: Object.create(null),\n    eventSourceList: [],\n    gestures: [],\n    gestureQueue: [],\n    /**\n     * Add a new event source that will generate pointer events.\n     *\n     * `inSource` must contain an array of event names named `events`, and\n     * functions with the names specified in the `events` array.\n     * @param {string} name A name for the event source\n     * @param {Object} source A new source of platform events.\n     */\n    registerSource: function(name, source) {\n      var s = source;\n      var newEvents = s.events;\n      if (newEvents) {\n        newEvents.forEach(function(e) {\n          if (s[e]) {\n            this.eventMap[e] = s[e].bind(s);\n          }\n        }, this);\n        this.eventSources[name] = s;\n        this.eventSourceList.push(s);\n      }\n    },\n    registerGesture: function(name, source) {\n      this.gestures.push(source);\n    },\n    register: function(element) {\n      var l = this.eventSourceList.length;\n      for (var i = 0, es; (i < l) && (es = this.eventSourceList[i]); i++) {\n        // call eventsource register\n        es.register.call(es, element);\n      }\n    },\n    unregister: function(element) {\n      var l = this.eventSourceList.length;\n      for (var i = 0, es; (i < l) && (es = this.eventSourceList[i]); i++) {\n        // call eventsource register\n        es.unregister.call(es, element);\n      }\n    },\n    // EVENTS\n    down: function(inEvent) {\n      this.fireEvent('down', inEvent);\n    },\n    move: function(inEvent) {\n      // pipe move events into gesture queue directly\n      inEvent.type = 'move';\n      this.fillGestureQueue(inEvent);\n    },\n    up: function(inEvent) {\n      this.fireEvent('up', inEvent);\n    },\n    // LISTENER LOGIC\n    eventHandler: function(inEvent) {\n      // This is used to prevent multiple dispatch of events from\n      // platform events. This can happen when two elements in different scopes\n      // are set up to create pointer events, which is relevant to Shadow DOM.\n      if (inEvent._handledByPG) {\n        return;\n      }\n      var type = inEvent.type;\n      var fn = this.eventMap && this.eventMap[type];\n      if (fn) {\n        fn(inEvent);\n      }\n      inEvent._handledByPG = true;\n    },\n    // set up event listeners\n    listen: function(target, events) {\n      events.forEach(function(e) {\n        this.addEvent(target, e);\n      }, this);\n    },\n    // remove event listeners\n    unlisten: function(target, events) {\n      events.forEach(function(e) {\n        this.removeEvent(target, e);\n      }, this);\n    },\n    addEvent: function(target, eventName) {\n      target.addEventListener(eventName, this.boundHandler);\n    },\n    removeEvent: function(target, eventName) {\n      target.removeEventListener(eventName, this.boundHandler);\n    },\n    // EVENT CREATION AND TRACKING\n    /**\n     * Creates a new Event of type `inType`, based on the information in\n     * `inEvent`.\n     *\n     * @param {string} inType A string representing the type of event to create\n     * @param {Event} inEvent A platform event with a target\n     * @return {Event} A PointerEvent of type `inType`\n     */\n    makeEvent: function(inType, inEvent) {\n      var e = eventFactory.makePointerEvent(inType, inEvent);\n      e.preventDefault = inEvent.preventDefault;\n      e._target = e._target || inEvent.target;\n      return e;\n    },\n    // make and dispatch an event in one call\n    fireEvent: function(inType, inEvent) {\n      var e = this.makeEvent(inType, inEvent);\n      return this.dispatchEvent(e);\n    },\n    /**\n     * Returns a snapshot of inEvent, with writable properties.\n     *\n     * @param {Event} inEvent An event that contains properties to copy.\n     * @return {Object} An object containing shallow copies of `inEvent`'s\n     *    properties.\n     */\n    cloneEvent: function(inEvent) {\n      var eventCopy = Object.create(null), p;\n      for (var i = 0; i < CLONE_PROPS.length; i++) {\n        p = CLONE_PROPS[i];\n        eventCopy[p] = inEvent[p] || CLONE_DEFAULTS[i];\n        // Work around SVGInstanceElement shadow tree\n        // Return the <use> element that is represented by the instance for Safari, Chrome, IE.\n        // This is the behavior implemented by Firefox.\n        if (HAS_SVG_INSTANCE && (p === 'target' || p === 'relatedTarget')) {\n          if (eventCopy[p] instanceof SVGElementInstance) {\n            eventCopy[p] = eventCopy[p].correspondingUseElement;\n          }\n        }\n      }\n      // keep the semantics of preventDefault\n      eventCopy.preventDefault = inEvent.preventDefault;\n      return eventCopy;\n    },\n    /**\n     * Dispatches the event to its target.\n     *\n     * @param {Event} inEvent The event to be dispatched.\n     * @return {Boolean} True if an event handler returns true, false otherwise.\n     */\n    dispatchEvent: function(inEvent) {\n      var t = inEvent._target;\n      if (t) {\n        t.dispatchEvent(inEvent);\n        // clone the event for the gesture system to process\n        // clone after dispatch to pick up gesture prevention code\n        var clone = this.cloneEvent(inEvent);\n        clone.target = inEvent._target;\n        this.fillGestureQueue(clone);\n      }\n    },\n    gestureTrigger: function() {\n      // process the gesture queue\n      for (var i = 0, e; i < this.gestureQueue.length; i++) {\n        e = this.gestureQueue[i];\n        for (var j = 0, g; j < this.gestures.length; j++) {\n          g = this.gestures[j];\n          if (g.events.indexOf(e.type) >= 0) {\n            g[e.type].call(g, e);\n          }\n        }\n      }\n      this.gestureQueue.length = 0;\n    },\n    fillGestureQueue: function(ev) {\n      // only trigger the gesture queue once\n      if (!this.gestureQueue.length) {\n        requestAnimationFrame(this.boundGestureTrigger);\n      }\n      this.gestureQueue.push(ev);\n    }\n  };\n  dispatcher.boundHandler = dispatcher.eventHandler.bind(dispatcher);\n  dispatcher.boundGestureTrigger = dispatcher.gestureTrigger.bind(dispatcher);\n  scope.dispatcher = dispatcher;\n  scope.register = dispatcher.register.bind(dispatcher);\n  scope.unregister = dispatcher.unregister.bind(dispatcher);\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This module uses Mutation Observers to dynamically adjust which nodes will\n * generate Pointer Events.\n *\n * All nodes that wish to generate Pointer Events must have the attribute\n * `touch-action` set to `none`.\n */\n(function(scope) {\n  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n  var map = Array.prototype.map.call.bind(Array.prototype.map);\n  var toArray = Array.prototype.slice.call.bind(Array.prototype.slice);\n  var filter = Array.prototype.filter.call.bind(Array.prototype.filter);\n  var MO = window.MutationObserver || window.WebKitMutationObserver;\n  var SELECTOR = '[touch-action]';\n  var OBSERVER_INIT = {\n    subtree: true,\n    childList: true,\n    attributes: true,\n    attributeOldValue: true,\n    attributeFilter: ['touch-action']\n  };\n\n  function Installer(add, remove, changed, binder) {\n    this.addCallback = add.bind(binder);\n    this.removeCallback = remove.bind(binder);\n    this.changedCallback = changed.bind(binder);\n    if (MO) {\n      this.observer = new MO(this.mutationWatcher.bind(this));\n    }\n  }\n\n  Installer.prototype = {\n    watchSubtree: function(target) {\n      // Only watch scopes that can target find, as these are top-level.\n      // Otherwise we can see duplicate additions and removals that add noise.\n      //\n      // TODO(dfreedman): For some instances with ShadowDOMPolyfill, we can see\n      // a removal without an insertion when a node is redistributed among\n      // shadows. Since it all ends up correct in the document, watching only\n      // the document will yield the correct mutations to watch.\n      if (scope.targetFinding.canTarget(target)) {\n        this.observer.observe(target, OBSERVER_INIT);\n      }\n    },\n    enableOnSubtree: function(target) {\n      this.watchSubtree(target);\n      if (target === document && document.readyState !== 'complete') {\n        this.installOnLoad();\n      } else {\n        this.installNewSubtree(target);\n      }\n    },\n    installNewSubtree: function(target) {\n      forEach(this.findElements(target), this.addElement, this);\n    },\n    findElements: function(target) {\n      if (target.querySelectorAll) {\n        return target.querySelectorAll(SELECTOR);\n      }\n      return [];\n    },\n    removeElement: function(el) {\n      this.removeCallback(el);\n    },\n    addElement: function(el) {\n      this.addCallback(el);\n    },\n    elementChanged: function(el, oldValue) {\n      this.changedCallback(el, oldValue);\n    },\n    concatLists: function(accum, list) {\n      return accum.concat(toArray(list));\n    },\n    // register all touch-action = none nodes on document load\n    installOnLoad: function() {\n      document.addEventListener('readystatechange', function() {\n        if (document.readyState === 'complete') {\n          this.installNewSubtree(document);\n        }\n      }.bind(this));\n    },\n    isElement: function(n) {\n      return n.nodeType === Node.ELEMENT_NODE;\n    },\n    flattenMutationTree: function(inNodes) {\n      // find children with touch-action\n      var tree = map(inNodes, this.findElements, this);\n      // make sure the added nodes are accounted for\n      tree.push(filter(inNodes, this.isElement));\n      // flatten the list\n      return tree.reduce(this.concatLists, []);\n    },\n    mutationWatcher: function(mutations) {\n      mutations.forEach(this.mutationHandler, this);\n    },\n    mutationHandler: function(m) {\n      if (m.type === 'childList') {\n        var added = this.flattenMutationTree(m.addedNodes);\n        added.forEach(this.addElement, this);\n        var removed = this.flattenMutationTree(m.removedNodes);\n        removed.forEach(this.removeElement, this);\n      } else if (m.type === 'attributes') {\n        this.elementChanged(m.target, m.oldValue);\n      }\n    }\n  };\n\n  if (!MO) {\n    Installer.prototype.watchSubtree = function(){\n      console.warn('PolymerGestures: MutationObservers not found, touch-action will not be dynamically detected');\n    };\n  }\n\n  scope.Installer = Installer;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function (scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  // radius around touchend that swallows mouse events\n  var DEDUP_DIST = 25;\n\n  var WHICH_TO_BUTTONS = [0, 1, 4, 2];\n\n  var HAS_BUTTONS = false;\n  try {\n    HAS_BUTTONS = new MouseEvent('test', {buttons: 1}).buttons === 1;\n  } catch (e) {}\n\n  // handler block for native mouse events\n  var mouseEvents = {\n    POINTER_ID: 1,\n    POINTER_TYPE: 'mouse',\n    events: [\n      'mousedown',\n      'mousemove',\n      'mouseup',\n    ],\n    register: function(target) {\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    lastTouches: [],\n    // collide with the global mouse listener\n    isEventSimulatedFromTouch: function(inEvent) {\n      var lts = this.lastTouches;\n      var x = inEvent.clientX, y = inEvent.clientY;\n      for (var i = 0, l = lts.length, t; i < l && (t = lts[i]); i++) {\n        // simulated mouse events will be swallowed near a primary touchend\n        var dx = Math.abs(x - t.x), dy = Math.abs(y - t.y);\n        if (dx <= DEDUP_DIST && dy <= DEDUP_DIST) {\n          return true;\n        }\n      }\n    },\n    prepareEvent: function(inEvent) {\n      var e = dispatcher.cloneEvent(inEvent);\n      e.pointerId = this.POINTER_ID;\n      e.isPrimary = true;\n      e.pointerType = this.POINTER_TYPE;\n      if (!HAS_BUTTONS) {\n        e.buttons = WHICH_TO_BUTTONS[e.which] || 0;\n      }\n      return e;\n    },\n    mousedown: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var p = pointermap.has(this.POINTER_ID);\n        // TODO(dfreedman) workaround for some elements not sending mouseup\n        // http://crbug/149091\n        if (p) {\n          this.mouseup(inEvent);\n        }\n        var e = this.prepareEvent(inEvent);\n        pointermap.set(this.POINTER_ID, inEvent.target);\n        dispatcher.down(e);\n      }\n    },\n    mousemove: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var e = this.prepareEvent(inEvent);\n        e.target = pointermap.get(this.POINTER_ID);\n        dispatcher.move(e);\n      }\n    },\n    mouseup: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var e = this.prepareEvent(inEvent);\n        e.target = pointermap.get(this.POINTER_ID);\n        e.relatedTarget = inEvent.target;\n        dispatcher.up(e);\n        this.cleanupMouse();\n      }\n    },\n    cleanupMouse: function() {\n      pointermap['delete'](this.POINTER_ID);\n    }\n  };\n\n  scope.mouseEvents = mouseEvents;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var allShadows = scope.targetFinding.allShadows.bind(scope.targetFinding);\n  var pointermap = dispatcher.pointermap;\n  var touchMap = Array.prototype.map.call.bind(Array.prototype.map);\n  // This should be long enough to ignore compat mouse events made by touch\n  var DEDUP_TIMEOUT = 2500;\n  var CLICK_COUNT_TIMEOUT = 200;\n  var ATTRIB = 'touch-action';\n  var INSTALLER;\n  var HAS_TOUCH_ACTION = typeof document.head.style.touchAction === 'string';\n\n  // handler block for native touch events\n  var touchEvents = {\n    events: [\n      'touchstart',\n      'touchmove',\n      'touchend',\n      'touchcancel'\n    ],\n    register: function(target) {\n      if (HAS_TOUCH_ACTION) {\n        dispatcher.listen(target, this.events);\n      } else {\n        INSTALLER.enableOnSubtree(target);\n      }\n    },\n    unregister: function(target) {\n      if (HAS_TOUCH_ACTION) {\n        dispatcher.unlisten(target, this.events);\n      } else {\n        // TODO(dfreedman): is it worth it to disconnect the MO?\n      }\n    },\n    elementAdded: function(el) {\n      var a = el.getAttribute(ATTRIB);\n      var st = this.touchActionToScrollType(a);\n      if (st) {\n        el._scrollType = st;\n        dispatcher.listen(el, this.events);\n        // set touch-action on shadows as well\n        allShadows(el).forEach(function(s) {\n          s._scrollType = st;\n          dispatcher.listen(s, this.events);\n        }, this);\n      }\n    },\n    elementRemoved: function(el) {\n      el._scrollType = undefined;\n      dispatcher.unlisten(el, this.events);\n      // remove touch-action from shadow\n      allShadows(el).forEach(function(s) {\n        s._scrollType = undefined;\n        dispatcher.unlisten(s, this.events);\n      }, this);\n    },\n    elementChanged: function(el, oldValue) {\n      var a = el.getAttribute(ATTRIB);\n      var st = this.touchActionToScrollType(a);\n      var oldSt = this.touchActionToScrollType(oldValue);\n      // simply update scrollType if listeners are already established\n      if (st && oldSt) {\n        el._scrollType = st;\n        allShadows(el).forEach(function(s) {\n          s._scrollType = st;\n        }, this);\n      } else if (oldSt) {\n        this.elementRemoved(el);\n      } else if (st) {\n        this.elementAdded(el);\n      }\n    },\n    scrollTypes: {\n      EMITTER: 'none',\n      XSCROLLER: 'pan-x',\n      YSCROLLER: 'pan-y',\n      SCROLLER: /^(?:pan-x pan-y)|(?:pan-y pan-x)|auto$/\n    },\n    touchActionToScrollType: function(touchAction) {\n      var t = touchAction;\n      var st = this.scrollTypes;\n      if (t === 'none') {\n        return 'none';\n      } else if (t === st.XSCROLLER) {\n        return 'X';\n      } else if (t === st.YSCROLLER) {\n        return 'Y';\n      } else if (st.SCROLLER.exec(t)) {\n        return 'XY';\n      }\n    },\n    POINTER_TYPE: 'touch',\n    firstTouch: null,\n    isPrimaryTouch: function(inTouch) {\n      return this.firstTouch === inTouch.identifier;\n    },\n    setPrimaryTouch: function(inTouch) {\n      // set primary touch if there no pointers, or the only pointer is the mouse\n      if (pointermap.pointers() === 0 || (pointermap.pointers() === 1 && pointermap.has(1))) {\n        this.firstTouch = inTouch.identifier;\n        this.firstXY = {X: inTouch.clientX, Y: inTouch.clientY};\n        this.scrolling = false;\n        this.cancelResetClickCount();\n      }\n    },\n    removePrimaryPointer: function(inPointer) {\n      if (inPointer.isPrimary) {\n        this.firstTouch = null;\n        this.firstXY = null;\n        this.resetClickCount();\n      }\n    },\n    clickCount: 0,\n    resetId: null,\n    resetClickCount: function() {\n      var fn = function() {\n        this.clickCount = 0;\n        this.resetId = null;\n      }.bind(this);\n      this.resetId = setTimeout(fn, CLICK_COUNT_TIMEOUT);\n    },\n    cancelResetClickCount: function() {\n      if (this.resetId) {\n        clearTimeout(this.resetId);\n      }\n    },\n    typeToButtons: function(type) {\n      var ret = 0;\n      if (type === 'touchstart' || type === 'touchmove') {\n        ret = 1;\n      }\n      return ret;\n    },\n    findTarget: function(touch, id) {\n      if (this.currentTouchEvent.type === 'touchstart') {\n        return scope.findTarget(touch);\n      }\n      // reuse target we found in touchstart\n      return pointermap.get(id);\n    },\n    touchToPointer: function(inTouch) {\n      var cte = this.currentTouchEvent;\n      var e = dispatcher.cloneEvent(inTouch);\n      // Spec specifies that pointerId 1 is reserved for Mouse.\n      // Touch identifiers can start at 0.\n      // Add 2 to the touch identifier for compatibility.\n      var id = e.pointerId = inTouch.identifier + 2;\n      e.target = this.findTarget(inTouch, id);\n      e.bubbles = true;\n      e.cancelable = true;\n      e.detail = this.clickCount;\n      e.buttons = this.typeToButtons(cte.type);\n      e.width = inTouch.webkitRadiusX || inTouch.radiusX || 0;\n      e.height = inTouch.webkitRadiusY || inTouch.radiusY || 0;\n      e.pressure = inTouch.webkitForce || inTouch.force || 0.5;\n      e.isPrimary = this.isPrimaryTouch(inTouch);\n      e.pointerType = this.POINTER_TYPE;\n      // forward touch preventDefaults\n      var self = this;\n      e.preventDefault = function() {\n        self.scrolling = false;\n        self.firstXY = null;\n        cte.preventDefault();\n      };\n      return e;\n    },\n    processTouches: function(inEvent, inFunction) {\n      var tl = inEvent.changedTouches;\n      this.currentTouchEvent = inEvent;\n      for (var i = 0, t; i < tl.length; i++) {\n        t = tl[i];\n        inFunction.call(this, this.touchToPointer(t));\n      }\n    },\n    // For single axis scrollers, determines whether the element should emit\n    // pointer events or behave as a scroller\n    shouldScroll: function(inEvent) {\n      if (this.firstXY) {\n        var ret;\n        var scrollAxis = inEvent.currentTarget._scrollType;\n        if (scrollAxis === 'none') {\n          // this element is a touch-action: none, should never scroll\n          ret = false;\n        } else if (scrollAxis === 'XY') {\n          // this element should always scroll\n          ret = true;\n        } else {\n          var t = inEvent.changedTouches[0];\n          // check the intended scroll axis, and other axis\n          var a = scrollAxis;\n          var oa = scrollAxis === 'Y' ? 'X' : 'Y';\n          var da = Math.abs(t['client' + a] - this.firstXY[a]);\n          var doa = Math.abs(t['client' + oa] - this.firstXY[oa]);\n          // if delta in the scroll axis > delta other axis, scroll instead of\n          // making events\n          ret = da >= doa;\n        }\n        this.firstXY = null;\n        return ret;\n      }\n    },\n    findTouch: function(inTL, inId) {\n      for (var i = 0, l = inTL.length, t; i < l && (t = inTL[i]); i++) {\n        if (t.identifier === inId) {\n          return true;\n        }\n      }\n    },\n    // In some instances, a touchstart can happen without a touchend. This\n    // leaves the pointermap in a broken state.\n    // Therefore, on every touchstart, we remove the touches that did not fire a\n    // touchend event.\n    // To keep state globally consistent, we fire a\n    // pointercancel for this \"abandoned\" touch\n    vacuumTouches: function(inEvent) {\n      var tl = inEvent.touches;\n      // pointermap.pointers() should be < tl.length here, as the touchstart has not\n      // been processed yet.\n      if (pointermap.pointers() >= tl.length) {\n        var d = [];\n        pointermap.forEach(function(value, key) {\n          // Never remove pointerId == 1, which is mouse.\n          // Touch identifiers are 2 smaller than their pointerId, which is the\n          // index in pointermap.\n          if (key !== 1 && !this.findTouch(tl, key - 2)) {\n            var p = value.out;\n            d.push(p);\n          }\n        }, this);\n        d.forEach(this.cancelOut, this);\n      }\n    },\n    touchstart: function(inEvent) {\n      this.vacuumTouches(inEvent);\n      this.setPrimaryTouch(inEvent.changedTouches[0]);\n      this.dedupSynthMouse(inEvent);\n      if (!this.scrolling) {\n        this.clickCount++;\n        this.processTouches(inEvent, this.down);\n      }\n    },\n    down: function(inPointer) {\n      var p = pointermap.set(inPointer.pointerId, inPointer.target);\n      dispatcher.down(inPointer);\n    },\n    touchmove: function(inEvent) {\n      if (HAS_TOUCH_ACTION) {\n        this.processTouches(inEvent, this.move);\n      } else {\n        if (!this.scrolling) {\n          if (this.shouldScroll(inEvent)) {\n            this.scrolling = true;\n            this.touchcancel(inEvent);\n          } else {\n            inEvent.preventDefault();\n            this.processTouches(inEvent, this.move);\n          }\n        }\n      }\n    },\n    move: function(inPointer) {\n      var pointer = pointermap.get(inPointer.pointerId);\n      // a finger drifted off the screen, ignore it\n      if (!pointer) {\n        return;\n      }\n      dispatcher.move(inPointer);\n    },\n    touchend: function(inEvent) {\n      this.dedupSynthMouse(inEvent);\n      this.processTouches(inEvent, this.up);\n    },\n    up: function(inPointer) {\n      if (!this.scrolling) {\n        inPointer.relatedTarget = scope.findTarget(inPointer);\n        dispatcher.up(inPointer);\n      }\n      this.cleanUpPointer(inPointer);\n    },\n    touchcancel: function(inEvent) {\n      this.processTouches(inEvent, this.up);\n    },\n    cleanUpPointer: function(inPointer) {\n      pointermap['delete'](inPointer.pointerId);\n      this.removePrimaryPointer(inPointer);\n    },\n    // prevent synth mouse events from creating pointer events\n    dedupSynthMouse: function(inEvent) {\n      var lts = scope.mouseEvents.lastTouches;\n      var t = inEvent.changedTouches[0];\n      // only the primary finger will synth mouse events\n      if (this.isPrimaryTouch(t)) {\n        // remember x/y of last touch\n        var lt = {x: t.clientX, y: t.clientY};\n        lts.push(lt);\n        var fn = (function(lts, lt){\n          var i = lts.indexOf(lt);\n          if (i > -1) {\n            lts.splice(i, 1);\n          }\n        }).bind(null, lts, lt);\n        setTimeout(fn, DEDUP_TIMEOUT);\n      }\n    }\n  };\n\n  if (!HAS_TOUCH_ACTION) {\n    INSTALLER = new scope.Installer(touchEvents.elementAdded, touchEvents.elementRemoved, touchEvents.elementChanged, touchEvents);\n  }\n\n  scope.touchEvents = touchEvents;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  var HAS_BITMAP_TYPE = window.MSPointerEvent && typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE === 'number';\n  var msEvents = {\n    events: [\n      'MSPointerDown',\n      'MSPointerMove',\n      'MSPointerUp',\n      'MSPointerCancel',\n    ],\n    register: function(target) {\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    POINTER_TYPES: [\n      '',\n      'unavailable',\n      'touch',\n      'pen',\n      'mouse'\n    ],\n    prepareEvent: function(inEvent) {\n      var e = inEvent;\n      if (HAS_BITMAP_TYPE) {\n        e = dispatcher.cloneEvent(inEvent);\n        e.pointerType = this.POINTER_TYPES[inEvent.pointerType];\n      }\n      return e;\n    },\n    cleanup: function(id) {\n      pointermap['delete'](id);\n    },\n    MSPointerDown: function(inEvent) {\n      pointermap.set(inEvent.pointerId, inEvent.target);\n      var e = this.prepareEvent(inEvent);\n      dispatcher.down(e);\n    },\n    MSPointerMove: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = pointermap.get(inEvent.pointerId);\n      dispatcher.move(e);\n    },\n    MSPointerUp: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = pointermap.get(inEvent.pointerId);\n      e.relatedTarget = inEvent.target;\n      dispatcher.up(e);\n      this.cleanup(inEvent.pointerId);\n    },\n    MSPointerCancel: function(inEvent) {\n      this.MSPointerUp(inEvent);\n    }\n  };\n\n  scope.msEvents = msEvents;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  var pointerEvents = {\n    events: [\n      'pointerdown',\n      'pointermove',\n      'pointerup',\n      'pointercancel'\n    ],\n    prepareEvent: function(inEvent) {\n      return dispatcher.cloneEvent(inEvent);\n    },\n    register: function(target) {\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    cleanup: function(id) {\n      pointermap['delete'](id);\n    },\n    pointerdown: function(inEvent) {\n      pointermap.set(inEvent.pointerId, inEvent.target);\n      var e = this.prepareEvent(inEvent);\n      dispatcher.down(e);\n    },\n    pointermove: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = pointermap.get(inEvent.pointerId);\n      dispatcher.move(e);\n    },\n    pointerup: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = pointermap.get(inEvent.pointerId);\n      e.relatedTarget = inEvent.target;\n      dispatcher.up(e);\n      this.cleanup(inEvent.pointerId);\n    },\n    pointercancel: function(inEvent) {\n      this.pointerup(inEvent);\n    }\n  };\n\n  scope.pointerEvents = pointerEvents;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This module contains the handlers for native platform events.\n * From here, the dispatcher is called to create unified pointer events.\n * Included are touch events (v1), mouse events, and MSPointerEvents.\n */\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n\n  if (window.PointerEvent) {\n    dispatcher.registerSource('pointer', scope.pointerEvents);\n  } else if (window.navigator.msPointerEnabled) {\n    dispatcher.registerSource('ms', scope.msEvents);\n  } else {\n    dispatcher.registerSource('mouse', scope.mouseEvents);\n    if (window.ontouchstart !== undefined) {\n      dispatcher.registerSource('touch', scope.touchEvents);\n    }\n  }\n\n  dispatcher.register(document);\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This event denotes the beginning of a series of tracking events.\n *\n * @module PointerGestures\n * @submodule Events\n * @class trackstart\n */\n/**\n * Pixels moved in the x direction since trackstart.\n * @type Number\n * @property dx\n */\n/**\n * Pixes moved in the y direction since trackstart.\n * @type Number\n * @property dy\n */\n/**\n * Pixels moved in the x direction since the last track.\n * @type Number\n * @property ddx\n */\n/**\n * Pixles moved in the y direction since the last track.\n * @type Number\n * @property ddy\n */\n/**\n * The clientX position of the track gesture.\n * @type Number\n * @property clientX\n */\n/**\n * The clientY position of the track gesture.\n * @type Number\n * @property clientY\n */\n/**\n * The pageX position of the track gesture.\n * @type Number\n * @property pageX\n */\n/**\n * The pageY position of the track gesture.\n * @type Number\n * @property pageY\n */\n/**\n * The screenX position of the track gesture.\n * @type Number\n * @property screenX\n */\n/**\n * The screenY position of the track gesture.\n * @type Number\n * @property screenY\n */\n/**\n * The last x axis direction of the pointer.\n * @type Number\n * @property xDirection\n */\n/**\n * The last y axis direction of the pointer.\n * @type Number\n * @property yDirection\n */\n/**\n * A shared object between all tracking events.\n * @type Object\n * @property trackInfo\n */\n/**\n * The element currently under the pointer.\n * @type Element\n * @property relatedTarget\n */\n/**\n * The type of pointer that make the track gesture.\n * @type String\n * @property pointerType\n */\n/**\n *\n * This event fires for all pointer movement being tracked.\n *\n * @class track\n * @extends trackstart\n */\n/**\n * This event fires when the pointer is no longer being tracked.\n *\n * @class trackend\n * @extends trackstart\n */\n\n (function(scope) {\n   var dispatcher = scope.dispatcher;\n   var eventFactory = scope.eventFactory;\n   var pointermap = new scope.PointerMap();\n   var track = {\n     events: [\n       'down',\n       'move',\n       'up',\n     ],\n     WIGGLE_THRESHOLD: 4,\n     clampDir: function(inDelta) {\n       return inDelta > 0 ? 1 : -1;\n     },\n     calcPositionDelta: function(inA, inB) {\n       var x = 0, y = 0;\n       if (inA && inB) {\n         x = inB.pageX - inA.pageX;\n         y = inB.pageY - inA.pageY;\n       }\n       return {x: x, y: y};\n     },\n     fireTrack: function(inType, inEvent, inTrackingData) {\n       var t = inTrackingData;\n       var d = this.calcPositionDelta(t.downEvent, inEvent);\n       var dd = this.calcPositionDelta(t.lastMoveEvent, inEvent);\n       if (dd.x) {\n         t.xDirection = this.clampDir(dd.x);\n       }\n       if (dd.y) {\n         t.yDirection = this.clampDir(dd.y);\n       }\n       var e = eventFactory.makeGestureEvent(inType, {\n         bubbles: true,\n         cancelable: true,\n         dx: d.x,\n         dy: d.y,\n         ddx: dd.x,\n         ddy: dd.y,\n         x: inEvent.x,\n         y: inEvent.y,\n         clientX: inEvent.clientX,\n         clientY: inEvent.clientY,\n         pageX: inEvent.pageX,\n         pageY: inEvent.pageY,\n         screenX: inEvent.screenX,\n         screenY: inEvent.screenY,\n         xDirection: t.xDirection,\n         yDirection: t.yDirection,\n         trackInfo: t.trackInfo,\n         relatedTarget: inEvent.relatedTarget,\n         pointerType: inEvent.pointerType,\n         pointerId: inEvent.pointerId\n       });\n       t.downTarget.dispatchEvent(e);\n     },\n     down: function(inEvent) {\n       if (inEvent.isPrimary && (inEvent.pointerType === 'mouse' ? inEvent.buttons === 1 : true)) {\n         var p = {\n           downEvent: inEvent,\n           downTarget: inEvent.target,\n           trackInfo: {},\n           lastMoveEvent: null,\n           xDirection: 0,\n           yDirection: 0,\n           tracking: false\n         };\n         pointermap.set(inEvent.pointerId, p);\n       }\n     },\n     move: function(inEvent) {\n       var p = pointermap.get(inEvent.pointerId);\n       if (p) {\n         if (!p.tracking) {\n           var d = this.calcPositionDelta(p.downEvent, inEvent);\n           var move = d.x * d.x + d.y * d.y;\n           // start tracking only if finger moves more than WIGGLE_THRESHOLD\n           if (move > this.WIGGLE_THRESHOLD) {\n             p.tracking = true;\n             this.fireTrack('trackstart', p.downEvent, p);\n             this.fireTrack('track', inEvent, p);\n           }\n         } else {\n           this.fireTrack('track', inEvent, p);\n         }\n         p.lastMoveEvent = inEvent;\n       }\n     },\n     up: function(inEvent) {\n       var p = pointermap.get(inEvent.pointerId);\n       if (p) {\n         if (p.tracking) {\n           this.fireTrack('trackend', inEvent, p);\n         }\n         pointermap.delete(inEvent.pointerId);\n       }\n     }\n   };\n   dispatcher.registerGesture('track', track);\n })(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This event is fired when a pointer quickly goes down and up, and is used to\n * denote activation.\n *\n * Any gesture event can prevent the tap event from being created by calling\n * `event.preventTap`.\n *\n * Any pointer event can prevent the tap by setting the `tapPrevented` property\n * on itself.\n *\n * @module PointerGestures\n * @submodule Events\n * @class tap\n */\n/**\n * X axis position of the tap.\n * @property x\n * @type Number\n */\n/**\n * Y axis position of the tap.\n * @property y\n * @type Number\n */\n/**\n * Type of the pointer that made the tap.\n * @property pointerType\n * @type String\n */\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var eventFactory = scope.eventFactory;\n  var pointermap = new scope.PointerMap();\n  var tap = {\n    events: [\n      'down',\n      'up'\n    ],\n    down: function(inEvent) {\n      if (inEvent.isPrimary && !inEvent.tapPrevented) {\n        pointermap.set(inEvent.pointerId, {\n          target: inEvent.target,\n          buttons: inEvent.buttons,\n          x: inEvent.clientX,\n          y: inEvent.clientY\n        });\n      }\n    },\n    shouldTap: function(e, downState) {\n      if (e.pointerType === 'mouse') {\n        // only allow left click to tap for mouse\n        return downState.buttons === 1;\n      }\n      return true;\n    },\n    up: function(inEvent) {\n      var start = pointermap.get(inEvent.pointerId);\n      if (start && this.shouldTap(inEvent, start)) {\n        // up.relatedTarget is target currently under finger\n        var t = scope.targetFinding.LCA(start.target, inEvent.relatedTarget);\n        if (t) {\n          var e = eventFactory.makeGestureEvent('tap', {\n            bubbles: true,\n            cancelable: true,\n            x: inEvent.clientX,\n            y: inEvent.clientY,\n            detail: inEvent.detail,\n            pointerType: inEvent.pointerType,\n            pointerId: inEvent.pointerId,\n            altKey: inEvent.altKey,\n            ctrlKey: inEvent.ctrlKey,\n            metaKey: inEvent.metaKey,\n            shiftKey: inEvent.shiftKey\n          });\n          t.dispatchEvent(e);\n        }\n      }\n      pointermap.delete(inEvent.pointerId);\n    }\n  };\n  // patch eventFactory to remove id from tap's pointermap for preventTap calls\n  eventFactory.preventTap = function(e) {\n    return function() {\n      pointermap.delete(e.pointerId);\n    };\n  };\n  dispatcher.registerGesture('tap', tap);\n})(window.PolymerGestures);\n","/*\n  Copyright (C) 2013 Ariya Hidayat <ariya.hidayat@gmail.com>\n  Copyright (C) 2013 Thaddee Tyl <thaddee.tyl@gmail.com>\n  Copyright (C) 2012 Ariya Hidayat <ariya.hidayat@gmail.com>\n  Copyright (C) 2012 Mathias Bynens <mathias@qiwi.be>\n  Copyright (C) 2012 Joost-Wim Boekesteijn <joost-wim@boekesteijn.nl>\n  Copyright (C) 2012 Kris Kowal <kris.kowal@cixar.com>\n  Copyright (C) 2012 Yusuke Suzuki <utatane.tea@gmail.com>\n  Copyright (C) 2012 Arpad Borsos <arpad.borsos@googlemail.com>\n  Copyright (C) 2011 Ariya Hidayat <ariya.hidayat@gmail.com>\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n(function (global) {\n    'use strict';\n\n    var Token,\n        TokenName,\n        Syntax,\n        Messages,\n        source,\n        index,\n        length,\n        delegate,\n        lookahead,\n        state;\n\n    Token = {\n        BooleanLiteral: 1,\n        EOF: 2,\n        Identifier: 3,\n        Keyword: 4,\n        NullLiteral: 5,\n        NumericLiteral: 6,\n        Punctuator: 7,\n        StringLiteral: 8\n    };\n\n    TokenName = {};\n    TokenName[Token.BooleanLiteral] = 'Boolean';\n    TokenName[Token.EOF] = '<end>';\n    TokenName[Token.Identifier] = 'Identifier';\n    TokenName[Token.Keyword] = 'Keyword';\n    TokenName[Token.NullLiteral] = 'Null';\n    TokenName[Token.NumericLiteral] = 'Numeric';\n    TokenName[Token.Punctuator] = 'Punctuator';\n    TokenName[Token.StringLiteral] = 'String';\n\n    Syntax = {\n        ArrayExpression: 'ArrayExpression',\n        BinaryExpression: 'BinaryExpression',\n        CallExpression: 'CallExpression',\n        ConditionalExpression: 'ConditionalExpression',\n        EmptyStatement: 'EmptyStatement',\n        ExpressionStatement: 'ExpressionStatement',\n        Identifier: 'Identifier',\n        Literal: 'Literal',\n        LabeledStatement: 'LabeledStatement',\n        LogicalExpression: 'LogicalExpression',\n        MemberExpression: 'MemberExpression',\n        ObjectExpression: 'ObjectExpression',\n        Program: 'Program',\n        Property: 'Property',\n        ThisExpression: 'ThisExpression',\n        UnaryExpression: 'UnaryExpression'\n    };\n\n    // Error messages should be identical to V8.\n    Messages = {\n        UnexpectedToken:  'Unexpected token %0',\n        UnknownLabel: 'Undefined label \\'%0\\'',\n        Redeclaration: '%0 \\'%1\\' has already been declared'\n    };\n\n    // Ensure the condition is true, otherwise throw an error.\n    // This is only to have a better contract semantic, i.e. another safety net\n    // to catch a logic error. The condition shall be fulfilled in normal case.\n    // Do NOT use this to enforce a certain condition on any user input.\n\n    function assert(condition, message) {\n        if (!condition) {\n            throw new Error('ASSERT: ' + message);\n        }\n    }\n\n    function isDecimalDigit(ch) {\n        return (ch >= 48 && ch <= 57);   // 0..9\n    }\n\n\n    // 7.2 White Space\n\n    function isWhiteSpace(ch) {\n        return (ch === 32) ||  // space\n            (ch === 9) ||      // tab\n            (ch === 0xB) ||\n            (ch === 0xC) ||\n            (ch === 0xA0) ||\n            (ch >= 0x1680 && '\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\uFEFF'.indexOf(String.fromCharCode(ch)) > 0);\n    }\n\n    // 7.3 Line Terminators\n\n    function isLineTerminator(ch) {\n        return (ch === 10) || (ch === 13) || (ch === 0x2028) || (ch === 0x2029);\n    }\n\n    // 7.6 Identifier Names and Identifiers\n\n    function isIdentifierStart(ch) {\n        return (ch === 36) || (ch === 95) ||  // $ (dollar) and _ (underscore)\n            (ch >= 65 && ch <= 90) ||         // A..Z\n            (ch >= 97 && ch <= 122);          // a..z\n    }\n\n    function isIdentifierPart(ch) {\n        return (ch === 36) || (ch === 95) ||  // $ (dollar) and _ (underscore)\n            (ch >= 65 && ch <= 90) ||         // A..Z\n            (ch >= 97 && ch <= 122) ||        // a..z\n            (ch >= 48 && ch <= 57);           // 0..9\n    }\n\n    // 7.6.1.1 Keywords\n\n    function isKeyword(id) {\n        return (id === 'this')\n    }\n\n    // 7.4 Comments\n\n    function skipWhitespace() {\n        while (index < length && isWhiteSpace(source.charCodeAt(index))) {\n           ++index;\n        }\n    }\n\n    function getIdentifier() {\n        var start, ch;\n\n        start = index++;\n        while (index < length) {\n            ch = source.charCodeAt(index);\n            if (isIdentifierPart(ch)) {\n                ++index;\n            } else {\n                break;\n            }\n        }\n\n        return source.slice(start, index);\n    }\n\n    function scanIdentifier() {\n        var start, id, type;\n\n        start = index;\n\n        id = getIdentifier();\n\n        // There is no keyword or literal with only one character.\n        // Thus, it must be an identifier.\n        if (id.length === 1) {\n            type = Token.Identifier;\n        } else if (isKeyword(id)) {\n            type = Token.Keyword;\n        } else if (id === 'null') {\n            type = Token.NullLiteral;\n        } else if (id === 'true' || id === 'false') {\n            type = Token.BooleanLiteral;\n        } else {\n            type = Token.Identifier;\n        }\n\n        return {\n            type: type,\n            value: id,\n            range: [start, index]\n        };\n    }\n\n\n    // 7.7 Punctuators\n\n    function scanPunctuator() {\n        var start = index,\n            code = source.charCodeAt(index),\n            code2,\n            ch1 = source[index],\n            ch2;\n\n        switch (code) {\n\n        // Check for most common single-character punctuators.\n        case 46:   // . dot\n        case 40:   // ( open bracket\n        case 41:   // ) close bracket\n        case 59:   // ; semicolon\n        case 44:   // , comma\n        case 123:  // { open curly brace\n        case 125:  // } close curly brace\n        case 91:   // [\n        case 93:   // ]\n        case 58:   // :\n        case 63:   // ?\n            ++index;\n            return {\n                type: Token.Punctuator,\n                value: String.fromCharCode(code),\n                range: [start, index]\n            };\n\n        default:\n            code2 = source.charCodeAt(index + 1);\n\n            // '=' (char #61) marks an assignment or comparison operator.\n            if (code2 === 61) {\n                switch (code) {\n                case 37:  // %\n                case 38:  // &\n                case 42:  // *:\n                case 43:  // +\n                case 45:  // -\n                case 47:  // /\n                case 60:  // <\n                case 62:  // >\n                case 124: // |\n                    index += 2;\n                    return {\n                        type: Token.Punctuator,\n                        value: String.fromCharCode(code) + String.fromCharCode(code2),\n                        range: [start, index]\n                    };\n\n                case 33: // !\n                case 61: // =\n                    index += 2;\n\n                    // !== and ===\n                    if (source.charCodeAt(index) === 61) {\n                        ++index;\n                    }\n                    return {\n                        type: Token.Punctuator,\n                        value: source.slice(start, index),\n                        range: [start, index]\n                    };\n                default:\n                    break;\n                }\n            }\n            break;\n        }\n\n        // Peek more characters.\n\n        ch2 = source[index + 1];\n\n        // Other 2-character punctuators: && ||\n\n        if (ch1 === ch2 && ('&|'.indexOf(ch1) >= 0)) {\n            index += 2;\n            return {\n                type: Token.Punctuator,\n                value: ch1 + ch2,\n                range: [start, index]\n            };\n        }\n\n        if ('<>=!+-*%&|^/'.indexOf(ch1) >= 0) {\n            ++index;\n            return {\n                type: Token.Punctuator,\n                value: ch1,\n                range: [start, index]\n            };\n        }\n\n        throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n    }\n\n    // 7.8.3 Numeric Literals\n    function scanNumericLiteral() {\n        var number, start, ch;\n\n        ch = source[index];\n        assert(isDecimalDigit(ch.charCodeAt(0)) || (ch === '.'),\n            'Numeric literal must start with a decimal digit or a decimal point');\n\n        start = index;\n        number = '';\n        if (ch !== '.') {\n            number = source[index++];\n            ch = source[index];\n\n            // Hex number starts with '0x'.\n            // Octal number starts with '0'.\n            if (number === '0') {\n                // decimal number starts with '0' such as '09' is illegal.\n                if (ch && isDecimalDigit(ch.charCodeAt(0))) {\n                    throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n                }\n            }\n\n            while (isDecimalDigit(source.charCodeAt(index))) {\n                number += source[index++];\n            }\n            ch = source[index];\n        }\n\n        if (ch === '.') {\n            number += source[index++];\n            while (isDecimalDigit(source.charCodeAt(index))) {\n                number += source[index++];\n            }\n            ch = source[index];\n        }\n\n        if (ch === 'e' || ch === 'E') {\n            number += source[index++];\n\n            ch = source[index];\n            if (ch === '+' || ch === '-') {\n                number += source[index++];\n            }\n            if (isDecimalDigit(source.charCodeAt(index))) {\n                while (isDecimalDigit(source.charCodeAt(index))) {\n                    number += source[index++];\n                }\n            } else {\n                throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n            }\n        }\n\n        if (isIdentifierStart(source.charCodeAt(index))) {\n            throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n        }\n\n        return {\n            type: Token.NumericLiteral,\n            value: parseFloat(number),\n            range: [start, index]\n        };\n    }\n\n    // 7.8.4 String Literals\n\n    function scanStringLiteral() {\n        var str = '', quote, start, ch, octal = false;\n\n        quote = source[index];\n        assert((quote === '\\'' || quote === '\"'),\n            'String literal must starts with a quote');\n\n        start = index;\n        ++index;\n\n        while (index < length) {\n            ch = source[index++];\n\n            if (ch === quote) {\n                quote = '';\n                break;\n            } else if (ch === '\\\\') {\n                ch = source[index++];\n                if (!ch || !isLineTerminator(ch.charCodeAt(0))) {\n                    switch (ch) {\n                    case 'n':\n                        str += '\\n';\n                        break;\n                    case 'r':\n                        str += '\\r';\n                        break;\n                    case 't':\n                        str += '\\t';\n                        break;\n                    case 'b':\n                        str += '\\b';\n                        break;\n                    case 'f':\n                        str += '\\f';\n                        break;\n                    case 'v':\n                        str += '\\x0B';\n                        break;\n\n                    default:\n                        str += ch;\n                        break;\n                    }\n                } else {\n                    if (ch ===  '\\r' && source[index] === '\\n') {\n                        ++index;\n                    }\n                }\n            } else if (isLineTerminator(ch.charCodeAt(0))) {\n                break;\n            } else {\n                str += ch;\n            }\n        }\n\n        if (quote !== '') {\n            throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n        }\n\n        return {\n            type: Token.StringLiteral,\n            value: str,\n            octal: octal,\n            range: [start, index]\n        };\n    }\n\n    function isIdentifierName(token) {\n        return token.type === Token.Identifier ||\n            token.type === Token.Keyword ||\n            token.type === Token.BooleanLiteral ||\n            token.type === Token.NullLiteral;\n    }\n\n    function advance() {\n        var ch;\n\n        skipWhitespace();\n\n        if (index >= length) {\n            return {\n                type: Token.EOF,\n                range: [index, index]\n            };\n        }\n\n        ch = source.charCodeAt(index);\n\n        // Very common: ( and ) and ;\n        if (ch === 40 || ch === 41 || ch === 58) {\n            return scanPunctuator();\n        }\n\n        // String literal starts with single quote (#39) or double quote (#34).\n        if (ch === 39 || ch === 34) {\n            return scanStringLiteral();\n        }\n\n        if (isIdentifierStart(ch)) {\n            return scanIdentifier();\n        }\n\n        // Dot (.) char #46 can also start a floating-point number, hence the need\n        // to check the next character.\n        if (ch === 46) {\n            if (isDecimalDigit(source.charCodeAt(index + 1))) {\n                return scanNumericLiteral();\n            }\n            return scanPunctuator();\n        }\n\n        if (isDecimalDigit(ch)) {\n            return scanNumericLiteral();\n        }\n\n        return scanPunctuator();\n    }\n\n    function lex() {\n        var token;\n\n        token = lookahead;\n        index = token.range[1];\n\n        lookahead = advance();\n\n        index = token.range[1];\n\n        return token;\n    }\n\n    function peek() {\n        var pos;\n\n        pos = index;\n        lookahead = advance();\n        index = pos;\n    }\n\n    // Throw an exception\n\n    function throwError(token, messageFormat) {\n        var error,\n            args = Array.prototype.slice.call(arguments, 2),\n            msg = messageFormat.replace(\n                /%(\\d)/g,\n                function (whole, index) {\n                    assert(index < args.length, 'Message reference must be in range');\n                    return args[index];\n                }\n            );\n\n        error = new Error(msg);\n        error.index = index;\n        error.description = msg;\n        throw error;\n    }\n\n    // Throw an exception because of the token.\n\n    function throwUnexpected(token) {\n        throwError(token, Messages.UnexpectedToken, token.value);\n    }\n\n    // Expect the next token to match the specified punctuator.\n    // If not, an exception will be thrown.\n\n    function expect(value) {\n        var token = lex();\n        if (token.type !== Token.Punctuator || token.value !== value) {\n            throwUnexpected(token);\n        }\n    }\n\n    // Return true if the next token matches the specified punctuator.\n\n    function match(value) {\n        return lookahead.type === Token.Punctuator && lookahead.value === value;\n    }\n\n    // Return true if the next token matches the specified keyword\n\n    function matchKeyword(keyword) {\n        return lookahead.type === Token.Keyword && lookahead.value === keyword;\n    }\n\n    function consumeSemicolon() {\n        // Catch the very common case first: immediately a semicolon (char #59).\n        if (source.charCodeAt(index) === 59) {\n            lex();\n            return;\n        }\n\n        skipWhitespace();\n\n        if (match(';')) {\n            lex();\n            return;\n        }\n\n        if (lookahead.type !== Token.EOF && !match('}')) {\n            throwUnexpected(lookahead);\n        }\n    }\n\n    // 11.1.4 Array Initialiser\n\n    function parseArrayInitialiser() {\n        var elements = [];\n\n        expect('[');\n\n        while (!match(']')) {\n            if (match(',')) {\n                lex();\n                elements.push(null);\n            } else {\n                elements.push(parseExpression());\n\n                if (!match(']')) {\n                    expect(',');\n                }\n            }\n        }\n\n        expect(']');\n\n        return delegate.createArrayExpression(elements);\n    }\n\n    // 11.1.5 Object Initialiser\n\n    function parseObjectPropertyKey() {\n        var token;\n\n        skipWhitespace();\n        token = lex();\n\n        // Note: This function is called only from parseObjectProperty(), where\n        // EOF and Punctuator tokens are already filtered out.\n        if (token.type === Token.StringLiteral || token.type === Token.NumericLiteral) {\n            return delegate.createLiteral(token);\n        }\n\n        return delegate.createIdentifier(token.value);\n    }\n\n    function parseObjectProperty() {\n        var token, key;\n\n        token = lookahead;\n        skipWhitespace();\n\n        if (token.type === Token.EOF || token.type === Token.Punctuator) {\n            throwUnexpected(token);\n        }\n\n        key = parseObjectPropertyKey();\n        expect(':');\n        return delegate.createProperty('init', key, parseExpression());\n    }\n\n    function parseObjectInitialiser() {\n        var properties = [];\n\n        expect('{');\n\n        while (!match('}')) {\n            properties.push(parseObjectProperty());\n\n            if (!match('}')) {\n                expect(',');\n            }\n        }\n\n        expect('}');\n\n        return delegate.createObjectExpression(properties);\n    }\n\n    // 11.1.6 The Grouping Operator\n\n    function parseGroupExpression() {\n        var expr;\n\n        expect('(');\n\n        expr = parseExpression();\n\n        expect(')');\n\n        return expr;\n    }\n\n\n    // 11.1 Primary Expressions\n\n    function parsePrimaryExpression() {\n        var type, token, expr;\n\n        if (match('(')) {\n            return parseGroupExpression();\n        }\n\n        type = lookahead.type;\n\n        if (type === Token.Identifier) {\n            expr = delegate.createIdentifier(lex().value);\n        } else if (type === Token.StringLiteral || type === Token.NumericLiteral) {\n            expr = delegate.createLiteral(lex());\n        } else if (type === Token.Keyword) {\n            if (matchKeyword('this')) {\n                lex();\n                expr = delegate.createThisExpression();\n            }\n        } else if (type === Token.BooleanLiteral) {\n            token = lex();\n            token.value = (token.value === 'true');\n            expr = delegate.createLiteral(token);\n        } else if (type === Token.NullLiteral) {\n            token = lex();\n            token.value = null;\n            expr = delegate.createLiteral(token);\n        } else if (match('[')) {\n            expr = parseArrayInitialiser();\n        } else if (match('{')) {\n            expr = parseObjectInitialiser();\n        }\n\n        if (expr) {\n            return expr;\n        }\n\n        throwUnexpected(lex());\n    }\n\n    // 11.2 Left-Hand-Side Expressions\n\n    function parseArguments() {\n        var args = [];\n\n        expect('(');\n\n        if (!match(')')) {\n            while (index < length) {\n                args.push(parseExpression());\n                if (match(')')) {\n                    break;\n                }\n                expect(',');\n            }\n        }\n\n        expect(')');\n\n        return args;\n    }\n\n    function parseNonComputedProperty() {\n        var token;\n\n        token = lex();\n\n        if (!isIdentifierName(token)) {\n            throwUnexpected(token);\n        }\n\n        return delegate.createIdentifier(token.value);\n    }\n\n    function parseNonComputedMember() {\n        expect('.');\n\n        return parseNonComputedProperty();\n    }\n\n    function parseComputedMember() {\n        var expr;\n\n        expect('[');\n\n        expr = parseExpression();\n\n        expect(']');\n\n        return expr;\n    }\n\n    function parseLeftHandSideExpression() {\n        var expr, property;\n\n        expr = parsePrimaryExpression();\n\n        while (match('.') || match('[')) {\n            if (match('[')) {\n                property = parseComputedMember();\n                expr = delegate.createMemberExpression('[', expr, property);\n            } else {\n                property = parseNonComputedMember();\n                expr = delegate.createMemberExpression('.', expr, property);\n            }\n        }\n\n        return expr;\n    }\n\n    // 11.3 Postfix Expressions\n\n    var parsePostfixExpression = parseLeftHandSideExpression;\n\n    // 11.4 Unary Operators\n\n    function parseUnaryExpression() {\n        var token, expr;\n\n        if (lookahead.type !== Token.Punctuator && lookahead.type !== Token.Keyword) {\n            expr = parsePostfixExpression();\n        } else if (match('+') || match('-') || match('!')) {\n            token = lex();\n            expr = parseUnaryExpression();\n            expr = delegate.createUnaryExpression(token.value, expr);\n        } else if (matchKeyword('delete') || matchKeyword('void') || matchKeyword('typeof')) {\n            throwError({}, Messages.UnexpectedToken);\n        } else {\n            expr = parsePostfixExpression();\n        }\n\n        return expr;\n    }\n\n    function binaryPrecedence(token) {\n        var prec = 0;\n\n        if (token.type !== Token.Punctuator && token.type !== Token.Keyword) {\n            return 0;\n        }\n\n        switch (token.value) {\n        case '||':\n            prec = 1;\n            break;\n\n        case '&&':\n            prec = 2;\n            break;\n\n        case '==':\n        case '!=':\n        case '===':\n        case '!==':\n            prec = 6;\n            break;\n\n        case '<':\n        case '>':\n        case '<=':\n        case '>=':\n        case 'instanceof':\n            prec = 7;\n            break;\n\n        case 'in':\n            prec = 7;\n            break;\n\n        case '+':\n        case '-':\n            prec = 9;\n            break;\n\n        case '*':\n        case '/':\n        case '%':\n            prec = 11;\n            break;\n\n        default:\n            break;\n        }\n\n        return prec;\n    }\n\n    // 11.5 Multiplicative Operators\n    // 11.6 Additive Operators\n    // 11.7 Bitwise Shift Operators\n    // 11.8 Relational Operators\n    // 11.9 Equality Operators\n    // 11.10 Binary Bitwise Operators\n    // 11.11 Binary Logical Operators\n\n    function parseBinaryExpression() {\n        var expr, token, prec, stack, right, operator, left, i;\n\n        left = parseUnaryExpression();\n\n        token = lookahead;\n        prec = binaryPrecedence(token);\n        if (prec === 0) {\n            return left;\n        }\n        token.prec = prec;\n        lex();\n\n        right = parseUnaryExpression();\n\n        stack = [left, token, right];\n\n        while ((prec = binaryPrecedence(lookahead)) > 0) {\n\n            // Reduce: make a binary expression from the three topmost entries.\n            while ((stack.length > 2) && (prec <= stack[stack.length - 2].prec)) {\n                right = stack.pop();\n                operator = stack.pop().value;\n                left = stack.pop();\n                expr = delegate.createBinaryExpression(operator, left, right);\n                stack.push(expr);\n            }\n\n            // Shift.\n            token = lex();\n            token.prec = prec;\n            stack.push(token);\n            expr = parseUnaryExpression();\n            stack.push(expr);\n        }\n\n        // Final reduce to clean-up the stack.\n        i = stack.length - 1;\n        expr = stack[i];\n        while (i > 1) {\n            expr = delegate.createBinaryExpression(stack[i - 1].value, stack[i - 2], expr);\n            i -= 2;\n        }\n\n        return expr;\n    }\n\n\n    // 11.12 Conditional Operator\n\n    function parseConditionalExpression() {\n        var expr, consequent, alternate;\n\n        expr = parseBinaryExpression();\n\n        if (match('?')) {\n            lex();\n            consequent = parseConditionalExpression();\n            expect(':');\n            alternate = parseConditionalExpression();\n\n            expr = delegate.createConditionalExpression(expr, consequent, alternate);\n        }\n\n        return expr;\n    }\n\n    // Simplification since we do not support AssignmentExpression.\n    var parseExpression = parseConditionalExpression;\n\n    // Polymer Syntax extensions\n\n    // Filter ::\n    //   Identifier\n    //   Identifier \"(\" \")\"\n    //   Identifier \"(\" FilterArguments \")\"\n\n    function parseFilter() {\n        var identifier, args;\n\n        identifier = lex();\n\n        if (identifier.type !== Token.Identifier) {\n            throwUnexpected(identifier);\n        }\n\n        args = match('(') ? parseArguments() : [];\n\n        return delegate.createFilter(identifier.value, args);\n    }\n\n    // Filters ::\n    //   \"|\" Filter\n    //   Filters \"|\" Filter\n\n    function parseFilters() {\n        while (match('|')) {\n            lex();\n            parseFilter();\n        }\n    }\n\n    // TopLevel ::\n    //   LabelledExpressions\n    //   AsExpression\n    //   InExpression\n    //   FilterExpression\n\n    // AsExpression ::\n    //   FilterExpression as Identifier\n\n    // InExpression ::\n    //   Identifier, Identifier in FilterExpression\n    //   Identifier in FilterExpression\n\n    // FilterExpression ::\n    //   Expression\n    //   Expression Filters\n\n    function parseTopLevel() {\n        skipWhitespace();\n        peek();\n\n        var expr = parseExpression();\n        if (expr) {\n            if (lookahead.value === ',' || lookahead.value == 'in' &&\n                       expr.type === Syntax.Identifier) {\n                parseInExpression(expr);\n            } else {\n                parseFilters();\n                if (lookahead.value === 'as') {\n                    parseAsExpression(expr);\n                } else {\n                    delegate.createTopLevel(expr);\n                }\n            }\n        }\n\n        if (lookahead.type !== Token.EOF) {\n            throwUnexpected(lookahead);\n        }\n    }\n\n    function parseAsExpression(expr) {\n        lex();  // as\n        var identifier = lex().value;\n        delegate.createAsExpression(expr, identifier);\n    }\n\n    function parseInExpression(identifier) {\n        var indexName;\n        if (lookahead.value === ',') {\n            lex();\n            if (lookahead.type !== Token.Identifier)\n                throwUnexpected(lookahead);\n            indexName = lex().value;\n        }\n\n        lex();  // in\n        var expr = parseExpression();\n        parseFilters();\n        delegate.createInExpression(identifier.name, indexName, expr);\n    }\n\n    function parse(code, inDelegate) {\n        delegate = inDelegate;\n        source = code;\n        index = 0;\n        length = source.length;\n        lookahead = null;\n        state = {\n            labelSet: {}\n        };\n\n        return parseTopLevel();\n    }\n\n    global.esprima = {\n        parse: parse\n    };\n})(this);\n","// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n// Code distributed by Google as part of the polymer project is also\n// subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n\n(function (global) {\n  'use strict';\n\n  // JScript does not have __proto__. We wrap all object literals with\n  // createObject which uses Object.create, Object.defineProperty and\n  // Object.getOwnPropertyDescriptor to create a new object that does the exact\n  // same thing. The main downside to this solution is that we have to extract\n  // all those property descriptors for IE.\n  var createObject = ('__proto__' in {}) ?\n      function(obj) { return obj; } :\n      function(obj) {\n        var proto = obj.__proto__;\n        if (!proto)\n          return obj;\n        var newObject = Object.create(proto);\n        Object.getOwnPropertyNames(obj).forEach(function(name) {\n          Object.defineProperty(newObject, name,\n                               Object.getOwnPropertyDescriptor(obj, name));\n        });\n        return newObject;\n      };\n\n  function prepareBinding(expressionText, name, node, filterRegistry) {\n    var expression;\n    try {\n      expression = getExpression(expressionText);\n      if (expression.scopeIdent &&\n          (node.nodeType !== Node.ELEMENT_NODE ||\n           node.tagName !== 'TEMPLATE' ||\n           (name !== 'bind' && name !== 'repeat'))) {\n        throw Error('as and in can only be used within <template bind/repeat>');\n      }\n    } catch (ex) {\n      console.error('Invalid expression syntax: ' + expressionText, ex);\n      return;\n    }\n\n    return function(model, node, oneTime) {\n      var binding = expression.getBinding(model, filterRegistry, oneTime);\n      if (expression.scopeIdent && binding) {\n        node.polymerExpressionScopeIdent_ = expression.scopeIdent;\n        if (expression.indexIdent)\n          node.polymerExpressionIndexIdent_ = expression.indexIdent;\n      }\n\n      return binding;\n    }\n  }\n\n  // TODO(rafaelw): Implement simple LRU.\n  var expressionParseCache = Object.create(null);\n\n  function getExpression(expressionText) {\n    var expression = expressionParseCache[expressionText];\n    if (!expression) {\n      var delegate = new ASTDelegate();\n      esprima.parse(expressionText, delegate);\n      expression = new Expression(delegate);\n      expressionParseCache[expressionText] = expression;\n    }\n    return expression;\n  }\n\n  function Literal(value) {\n    this.value = value;\n    this.valueFn_ = undefined;\n  }\n\n  Literal.prototype = {\n    valueFn: function() {\n      if (!this.valueFn_) {\n        var value = this.value;\n        this.valueFn_ = function() {\n          return value;\n        }\n      }\n\n      return this.valueFn_;\n    }\n  }\n\n  function IdentPath(name) {\n    this.name = name;\n    this.path = Path.get(name);\n  }\n\n  IdentPath.prototype = {\n    valueFn: function() {\n      if (!this.valueFn_) {\n        var name = this.name;\n        var path = this.path;\n        this.valueFn_ = function(model, observer) {\n          if (observer)\n            observer.addPath(model, path);\n\n          return path.getValueFrom(model);\n        }\n      }\n\n      return this.valueFn_;\n    },\n\n    setValue: function(model, newValue) {\n      if (this.path.length == 1);\n        model = findScope(model, this.path[0]);\n\n      return this.path.setValueFrom(model, newValue);\n    }\n  };\n\n  function MemberExpression(object, property, accessor) {\n    // convert literal computed property access where literal value is a value\n    // path to ident dot-access.\n    if (accessor == '[' &&\n        property instanceof Literal &&\n        Path.get(property.value).valid) {\n      accessor = '.';\n      property = new IdentPath(property.value);\n    }\n\n    this.dynamicDeps = typeof object == 'function' || object.dynamic;\n\n    this.dynamic = typeof property == 'function' ||\n                   property.dynamic ||\n                   accessor == '[';\n\n    this.simplePath =\n        !this.dynamic &&\n        !this.dynamicDeps &&\n        property instanceof IdentPath &&\n        (object instanceof MemberExpression || object instanceof IdentPath);\n\n    this.object = this.simplePath ? object : getFn(object);\n    this.property = accessor == '.' ? property : getFn(property);\n  }\n\n  MemberExpression.prototype = {\n    get fullPath() {\n      if (!this.fullPath_) {\n        var last = this.object instanceof IdentPath ?\n            this.object.name : this.object.fullPath;\n        this.fullPath_ = Path.get(last + '.' + this.property.name);\n      }\n\n      return this.fullPath_;\n    },\n\n    valueFn: function() {\n      if (!this.valueFn_) {\n        var object = this.object;\n\n        if (this.simplePath) {\n          var path = this.fullPath;\n\n          this.valueFn_ = function(model, observer) {\n            if (observer)\n              observer.addPath(model, path);\n\n            return path.getValueFrom(model);\n          };\n        } else if (this.property instanceof IdentPath) {\n          var path = Path.get(this.property.name);\n\n          this.valueFn_ = function(model, observer) {\n            var context = object(model, observer);\n\n            if (observer)\n              observer.addPath(context, path);\n\n            return path.getValueFrom(context);\n          }\n        } else {\n          // Computed property.\n          var property = this.property;\n\n          this.valueFn_ = function(model, observer) {\n            var context = object(model, observer);\n            var propName = property(model, observer);\n            if (observer)\n              observer.addPath(context, propName);\n\n            return context ? context[propName] : undefined;\n          };\n        }\n      }\n      return this.valueFn_;\n    },\n\n    setValue: function(model, newValue) {\n      if (this.simplePath) {\n        this.fullPath.setValueFrom(model, newValue);\n        return newValue;\n      }\n\n      var object = this.object(model);\n      var propName = this.property instanceof IdentPath ? this.property.name :\n          this.property(model);\n      return object[propName] = newValue;\n    }\n  };\n\n  function Filter(name, args) {\n    this.name = name;\n    this.args = [];\n    for (var i = 0; i < args.length; i++) {\n      this.args[i] = getFn(args[i]);\n    }\n  }\n\n  Filter.prototype = {\n    transform: function(value, toModelDirection, filterRegistry, model,\n                        observer) {\n      var fn = filterRegistry[this.name];\n      var context = model;\n      if (fn) {\n        context = undefined;\n      } else {\n        fn = context[this.name];\n        if (!fn) {\n          console.error('Cannot find filter: ' + this.name);\n          return;\n        }\n      }\n\n      // If toModelDirection is falsey, then the \"normal\" (dom-bound) direction\n      // is used. Otherwise, it looks for a 'toModel' property function on the\n      // object.\n      if (toModelDirection) {\n        fn = fn.toModel;\n      } else if (typeof fn.toDOM == 'function') {\n        fn = fn.toDOM;\n      }\n\n      if (typeof fn != 'function') {\n        console.error('No ' + (toModelDirection ? 'toModel' : 'toDOM') +\n                      ' found on' + this.name);\n        return;\n      }\n\n      var args = [value];\n      for (var i = 0; i < this.args.length; i++) {\n        args[i + 1] = getFn(this.args[i])(model, observer);\n      }\n\n      return fn.apply(context, args);\n    }\n  };\n\n  function notImplemented() { throw Error('Not Implemented'); }\n\n  var unaryOperators = {\n    '+': function(v) { return +v; },\n    '-': function(v) { return -v; },\n    '!': function(v) { return !v; }\n  };\n\n  var binaryOperators = {\n    '+': function(l, r) { return l+r; },\n    '-': function(l, r) { return l-r; },\n    '*': function(l, r) { return l*r; },\n    '/': function(l, r) { return l/r; },\n    '%': function(l, r) { return l%r; },\n    '<': function(l, r) { return l<r; },\n    '>': function(l, r) { return l>r; },\n    '<=': function(l, r) { return l<=r; },\n    '>=': function(l, r) { return l>=r; },\n    '==': function(l, r) { return l==r; },\n    '!=': function(l, r) { return l!=r; },\n    '===': function(l, r) { return l===r; },\n    '!==': function(l, r) { return l!==r; },\n    '&&': function(l, r) { return l&&r; },\n    '||': function(l, r) { return l||r; },\n  };\n\n  function getFn(arg) {\n    return typeof arg == 'function' ? arg : arg.valueFn();\n  }\n\n  function ASTDelegate() {\n    this.expression = null;\n    this.filters = [];\n    this.deps = {};\n    this.currentPath = undefined;\n    this.scopeIdent = undefined;\n    this.indexIdent = undefined;\n    this.dynamicDeps = false;\n  }\n\n  ASTDelegate.prototype = {\n    createUnaryExpression: function(op, argument) {\n      if (!unaryOperators[op])\n        throw Error('Disallowed operator: ' + op);\n\n      argument = getFn(argument);\n\n      return function(model, observer) {\n        return unaryOperators[op](argument(model, observer));\n      };\n    },\n\n    createBinaryExpression: function(op, left, right) {\n      if (!binaryOperators[op])\n        throw Error('Disallowed operator: ' + op);\n\n      left = getFn(left);\n      right = getFn(right);\n\n      return function(model, observer) {\n        return binaryOperators[op](left(model, observer),\n                                   right(model, observer));\n      };\n    },\n\n    createConditionalExpression: function(test, consequent, alternate) {\n      test = getFn(test);\n      consequent = getFn(consequent);\n      alternate = getFn(alternate);\n\n      return function(model, observer) {\n        return test(model, observer) ?\n            consequent(model, observer) : alternate(model, observer);\n      }\n    },\n\n    createIdentifier: function(name) {\n      var ident = new IdentPath(name);\n      ident.type = 'Identifier';\n      return ident;\n    },\n\n    createMemberExpression: function(accessor, object, property) {\n      var ex = new MemberExpression(object, property, accessor);\n      if (ex.dynamicDeps)\n        this.dynamicDeps = true;\n      return ex;\n    },\n\n    createLiteral: function(token) {\n      return new Literal(token.value);\n    },\n\n    createArrayExpression: function(elements) {\n      for (var i = 0; i < elements.length; i++)\n        elements[i] = getFn(elements[i]);\n\n      return function(model, observer) {\n        var arr = []\n        for (var i = 0; i < elements.length; i++)\n          arr.push(elements[i](model, observer));\n        return arr;\n      }\n    },\n\n    createProperty: function(kind, key, value) {\n      return {\n        key: key instanceof IdentPath ? key.name : key.value,\n        value: value\n      };\n    },\n\n    createObjectExpression: function(properties) {\n      for (var i = 0; i < properties.length; i++)\n        properties[i].value = getFn(properties[i].value);\n\n      return function(model, observer) {\n        var obj = {};\n        for (var i = 0; i < properties.length; i++)\n          obj[properties[i].key] = properties[i].value(model, observer);\n        return obj;\n      }\n    },\n\n    createFilter: function(name, args) {\n      this.filters.push(new Filter(name, args));\n    },\n\n    createAsExpression: function(expression, scopeIdent) {\n      this.expression = expression;\n      this.scopeIdent = scopeIdent;\n    },\n\n    createInExpression: function(scopeIdent, indexIdent, expression) {\n      this.expression = expression;\n      this.scopeIdent = scopeIdent;\n      this.indexIdent = indexIdent;\n    },\n\n    createTopLevel: function(expression) {\n      this.expression = expression;\n    },\n\n    createThisExpression: notImplemented\n  }\n\n  function ConstantObservable(value) {\n    this.value_ = value;\n  }\n\n  ConstantObservable.prototype = {\n    open: function() { return this.value_; },\n    discardChanges: function() { return this.value_; },\n    deliver: function() {},\n    close: function() {},\n  }\n\n  function Expression(delegate) {\n    this.scopeIdent = delegate.scopeIdent;\n    this.indexIdent = delegate.indexIdent;\n\n    if (!delegate.expression)\n      throw Error('No expression found.');\n\n    this.expression = delegate.expression;\n    getFn(this.expression); // forces enumeration of path dependencies\n\n    this.filters = delegate.filters;\n    this.dynamicDeps = delegate.dynamicDeps;\n  }\n\n  Expression.prototype = {\n    getBinding: function(model, filterRegistry, oneTime) {\n      if (oneTime)\n        return this.getValue(model, undefined, filterRegistry);\n\n      var observer = new CompoundObserver();\n      // captures deps.\n      var firstValue = this.getValue(model, observer, filterRegistry);\n      var firstTime = true;\n      var self = this;\n\n      function valueFn() {\n        // deps cannot have changed on first value retrieval.\n        if (firstTime) {\n          firstTime = false;\n          return firstValue;\n        }\n\n        if (self.dynamicDeps)\n          observer.startReset();\n\n        var value = self.getValue(model,\n                                  self.dynamicDeps ? observer : undefined,\n                                  filterRegistry);\n        if (self.dynamicDeps)\n          observer.finishReset();\n\n        return value;\n      }\n\n      function setValueFn(newValue) {\n        self.setValue(model, newValue, filterRegistry);\n        return newValue;\n      }\n\n      return new ObserverTransform(observer, valueFn, setValueFn, true);\n    },\n\n    getValue: function(model, observer, filterRegistry) {\n      var value = getFn(this.expression)(model, observer);\n      for (var i = 0; i < this.filters.length; i++) {\n        value = this.filters[i].transform(value, false, filterRegistry, model,\n                                          observer);\n      }\n\n      return value;\n    },\n\n    setValue: function(model, newValue, filterRegistry) {\n      var count = this.filters ? this.filters.length : 0;\n      while (count-- > 0) {\n        newValue = this.filters[count].transform(newValue, true, filterRegistry,\n                                                 model);\n      }\n\n      if (this.expression.setValue)\n        return this.expression.setValue(model, newValue);\n    }\n  }\n\n  /**\n   * Converts a style property name to a css property name. For example:\n   * \"WebkitUserSelect\" to \"-webkit-user-select\"\n   */\n  function convertStylePropertyName(name) {\n    return String(name).replace(/[A-Z]/g, function(c) {\n      return '-' + c.toLowerCase();\n    });\n  }\n\n  function isEventHandler(name) {\n    return name[0] === 'o' &&\n           name[1] === 'n' &&\n           name[2] === '-';\n  }\n\n  var mixedCaseEventTypes = {};\n  [\n    'webkitAnimationStart',\n    'webkitAnimationEnd',\n    'webkitTransitionEnd',\n    'DOMFocusOut',\n    'DOMFocusIn',\n    'DOMMouseScroll'\n  ].forEach(function(e) {\n    mixedCaseEventTypes[e.toLowerCase()] = e;\n  });\n\n  var parentScopeName = '@' + Math.random().toString(36).slice(2);\n\n  // Single ident paths must bind directly to the appropriate scope object.\n  // I.e. Pushed values in two-bindings need to be assigned to the actual model\n  // object.\n  function findScope(model, prop) {\n    while (model[parentScopeName] &&\n           !Object.prototype.hasOwnProperty.call(model, prop)) {\n      model = model[parentScopeName];\n    }\n\n    return model;\n  }\n\n  function resolveEventReceiver(model, path, node) {\n    if (path.length == 0)\n      return undefined;\n\n    if (path.length == 1)\n      return findScope(model, path[0]);\n\n    for (var i = 0; model != null && i < path.length - 1; i++) {\n      model = model[path[i]];\n    }\n\n    return model;\n  }\n\n  function prepareEventBinding(path, name, polymerExpressions) {\n    var eventType = name.substring(3);\n    eventType = mixedCaseEventTypes[eventType] || eventType;\n\n    return function(model, node, oneTime) {\n      var fn, receiver, handler;\n      if (typeof polymerExpressions.resolveEventHandler == 'function') {\n        handler = function(e) {\n          fn = fn || polymerExpressions.resolveEventHandler(model, path, node);\n          if (fn) {\n            fn(e, e.detail, e.currentTarget);\n            if (Platform && typeof Platform.flush == 'function')\n              Platform.flush();\n          }\n        };\n      } else {\n        handler = function(e) {\n          fn = fn || path.getValueFrom(model);\n          receiver = receiver || resolveEventReceiver(model, path, node);\n          if (fn) {\n            fn.apply(receiver, [e, e.detail, e.currentTarget]);\n            if (Platform && typeof Platform.flush == 'function')\n              Platform.flush();\n          }\n        };\n      }\n\n      node.addEventListener(eventType, handler);\n\n      if (oneTime)\n        return;\n\n      function bindingValue() {\n        return '{{ ' + path + ' }}';\n      }\n\n      return {\n        open: bindingValue,\n        discardChanges: bindingValue,\n        close: function() {\n          node.removeEventListener(eventType, handler);\n        }\n      };\n    }\n  }\n\n  function isLiteralExpression(pathString) {\n    switch (pathString) {\n      case '':\n        return false;\n\n      case 'false':\n      case 'null':\n      case 'true':\n        return true;\n    }\n\n    if (!isNaN(Number(pathString)))\n      return true;\n\n    return false;\n  };\n\n  function PolymerExpressions() {}\n\n  PolymerExpressions.prototype = {\n    // \"built-in\" filters\n    styleObject: function(value) {\n      var parts = [];\n      for (var key in value) {\n        parts.push(convertStylePropertyName(key) + ': ' + value[key]);\n      }\n      return parts.join('; ');\n    },\n\n    tokenList: function(value) {\n      var tokens = [];\n      for (var key in value) {\n        if (value[key])\n          tokens.push(key);\n      }\n      return tokens.join(' ');\n    },\n\n    // binding delegate API\n    prepareInstancePositionChanged: function(template) {\n      var indexIdent = template.polymerExpressionIndexIdent_;\n      if (!indexIdent)\n        return;\n\n      return function(templateInstance, index) {\n        templateInstance.model[indexIdent] = index;\n      };\n    },\n\n    prepareBinding: function(pathString, name, node) {\n      var path = Path.get(pathString);\n      if (isEventHandler(name)) {\n        if (!path.valid) {\n          console.error('on-* bindings must be simple path expressions');\n          return;\n        }\n\n        return prepareEventBinding(path, name, this);\n      }\n\n      if (!isLiteralExpression(pathString) && path.valid) {\n        if (path.length == 1) {\n          return function(model, node, oneTime) {\n            if (oneTime)\n              return path.getValueFrom(model);\n\n            var scope = findScope(model, path[0]);\n            return new PathObserver(scope, path);\n          };\n        }\n        return; // bail out early if pathString is simple path.\n      }\n\n      return prepareBinding(pathString, name, node, this);\n    },\n\n    prepareInstanceModel: function(template) {\n      var scopeName = template.polymerExpressionScopeIdent_;\n      if (!scopeName)\n        return;\n\n      var parentScope = template.templateInstance ?\n          template.templateInstance.model :\n          template.model;\n\n      var indexName = template.polymerExpressionIndexIdent_;\n\n      return function(model) {\n        var scope = Object.create(parentScope);\n        scope[scopeName] = model;\n        scope[indexName] = undefined;\n        scope[parentScopeName] = parentScope;\n        return scope;\n      };\n    }\n  };\n\n  global.PolymerExpressions = PolymerExpressions;\n  if (global.exposeGetExpression)\n    global.getExpression_ = getExpression;\n\n  global.PolymerExpressions.prepareEventBinding = prepareEventBinding;\n})(this);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\nPolymer = {};\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n// TODO(sorvell): this ensures Polymer is an object and not a function\n// Platform is currently defining it as a function to allow for async loading\n// of polymer; once we refine the loading process this likely goes away.\nif (typeof window.Polymer === 'function') {\n  Polymer = {};\n}\n\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope) {\n\n  // copy own properties from 'api' to 'prototype, with name hinting for 'super'\n  function extend(prototype, api) {\n    if (prototype && api) {\n      // use only own properties of 'api'\n      Object.getOwnPropertyNames(api).forEach(function(n) {\n        // acquire property descriptor\n        var pd = Object.getOwnPropertyDescriptor(api, n);\n        if (pd) {\n          // clone property via descriptor\n          Object.defineProperty(prototype, n, pd);\n          // cache name-of-method for 'super' engine\n          if (typeof pd.value == 'function') {\n            // hint the 'super' engine\n            pd.value.nom = n;\n          }\n        }\n      });\n    }\n    return prototype;\n  }\n  \n  // exports\n\n  scope.extend = extend;\n\n})(Polymer);\n","/* \n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  \n  // usage\n  \n  // invoke cb.call(this) in 100ms, unless the job is re-registered,\n  // which resets the timer\n  // \n  // this.myJob = this.job(this.myJob, cb, 100)\n  //\n  // returns a job handle which can be used to re-register a job\n\n  var Job = function(inContext) {\n    this.context = inContext;\n    this.boundComplete = this.complete.bind(this)\n  };\n  Job.prototype = {\n    go: function(callback, wait) {\n      this.callback = callback;\n      var h;\n      if (!wait) {\n        h = requestAnimationFrame(this.boundComplete);\n        this.handle = function() {\n          cancelAnimationFrame(h);\n        }\n      } else {\n        h = setTimeout(this.boundComplete, wait);\n        this.handle = function() {\n          clearTimeout(h);\n        }\n      }\n    },\n    stop: function() {\n      if (this.handle) {\n        this.handle();\n        this.handle = null;\n      }\n    },\n    complete: function() {\n      if (this.handle) {\n        this.stop();\n        this.callback.call(this.context);\n      }\n    }\n  };\n  \n  function job(job, callback, wait) {\n    if (job) {\n      job.stop();\n    } else {\n      job = new Job(this);\n    }\n    job.go(callback, wait);\n    return job;\n  }\n  \n  // exports \n\n  scope.job = job;\n  \n})(Polymer);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope) {\n\n  var registry = {};\n\n  HTMLElement.register = function(tag, prototype) {\n    registry[tag] = prototype;\n  }\n\n  // get prototype mapped to node <tag>\n  HTMLElement.getPrototypeForTag = function(tag) {\n    var prototype = !tag ? HTMLElement.prototype : registry[tag];\n    // TODO(sjmiles): creating <tag> is likely to have wasteful side-effects\n    return prototype || Object.getPrototypeOf(document.createElement(tag));\n  };\n\n  // we have to flag propagation stoppage for the event dispatcher\n  var originalStopPropagation = Event.prototype.stopPropagation;\n  Event.prototype.stopPropagation = function() {\n    this.cancelBubble = true;\n    originalStopPropagation.apply(this, arguments);\n  };\n  \n  // TODO(sorvell): remove when we're sure imports does not need\n  // to load stylesheets\n  /*\n  HTMLImports.importer.preloadSelectors += \n      ', polymer-element link[rel=stylesheet]';\n  */\n})(Polymer);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n (function(scope) {\n    // super\n\n    // `arrayOfArgs` is an optional array of args like one might pass\n    // to `Function.apply`\n\n    // TODO(sjmiles):\n    //    $super must be installed on an instance or prototype chain\n    //    as `super`, and invoked via `this`, e.g.\n    //      `this.super();`\n\n    //    will not work if function objects are not unique, for example,\n    //    when using mixins.\n    //    The memoization strategy assumes each function exists on only one \n    //    prototype chain i.e. we use the function object for memoizing)\n    //    perhaps we can bookkeep on the prototype itself instead\n    function $super(arrayOfArgs) {\n      // since we are thunking a method call, performance is important here: \n      // memoize all lookups, once memoized the fast path calls no other \n      // functions\n      //\n      // find the caller (cannot be `strict` because of 'caller')\n      var caller = $super.caller;\n      // memoized 'name of method' \n      var nom = caller.nom;\n      // memoized next implementation prototype\n      var _super = caller._super;\n      if (!_super) {\n        if (!nom) {\n          nom = caller.nom = nameInThis.call(this, caller);\n        }\n        if (!nom) {\n          console.warn('called super() on a method not installed declaratively (has no .nom property)');\n        }\n        // super prototype is either cached or we have to find it\n        // by searching __proto__ (at the 'top')\n        _super = memoizeSuper(caller, nom, getPrototypeOf(this));\n      }\n      if (!_super) {\n        // if _super is falsey, there is no super implementation\n        //console.warn('called $super(' + nom + ') where there is no super implementation');\n      } else {\n        // our super function\n        var fn = _super[nom];\n        // memoize information so 'fn' can call 'super'\n        if (!fn._super) {\n          memoizeSuper(fn, nom, _super);\n        }\n        // invoke the inherited method\n        // if 'fn' is not function valued, this will throw\n        return fn.apply(this, arrayOfArgs || []);\n      }\n    }\n\n    function nextSuper(proto, name, caller) {\n      // look for an inherited prototype that implements name\n      while (proto) {\n        if ((proto[name] !== caller) && proto[name]) {\n          return proto;\n        }\n        proto = getPrototypeOf(proto);\n      }\n    }\n\n    function memoizeSuper(method, name, proto) {\n      // find and cache next prototype containing `name`\n      // we need the prototype so we can do another lookup\n      // from here\n      method._super = nextSuper(proto, name, method);\n      if (method._super) {\n        // _super is a prototype, the actual method is _super[name]\n        // tag super method with it's name for further lookups\n        method._super[name].nom = name;\n      }\n      return method._super;\n    }\n\n    function nameInThis(value) {\n      var p = this.__proto__;\n      while (p && p !== HTMLElement.prototype) {\n        // TODO(sjmiles): getOwnPropertyNames is absurdly expensive\n        var n$ = Object.getOwnPropertyNames(p);\n        for (var i=0, l=n$.length, n; i<l && (n=n$[i]); i++) {\n          var d = Object.getOwnPropertyDescriptor(p, n);\n          if (typeof d.value === 'function' && d.value === value) {\n            return n;\n          }\n        }\n        p = p.__proto__;\n      }\n    }\n\n    // NOTE: In some platforms (IE10) the prototype chain is faked via \n    // __proto__. Therefore, always get prototype via __proto__ instead of\n    // the more standard Object.getPrototypeOf.\n    function getPrototypeOf(prototype) {\n      return prototype.__proto__;\n    }\n\n    // utility function to precompute name tags for functions\n    // in a (unchained) prototype\n    function hintSuper(prototype) {\n      // tag functions with their prototype name to optimize\n      // super call invocations\n      for (var n in prototype) {\n        var pd = Object.getOwnPropertyDescriptor(prototype, n);\n        if (pd && typeof pd.value === 'function') {\n          pd.value.nom = n;\n        }\n      }\n    }\n\n    // exports\n\n    scope.super = $super;\n\n})(Polymer);\n","/* \n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\n  var typeHandlers = {\n    string: function(value) {\n      return value;\n    },\n    date: function(value) {\n      return new Date(Date.parse(value) || Date.now());\n    },\n    boolean: function(value) {\n      if (value === '') {\n        return true;\n      }\n      return value === 'false' ? false : !!value;\n    },\n    number: function(value) {\n      var n = parseFloat(value);\n      // hex values like \"0xFFFF\" parseFloat as 0\n      if (n === 0) {\n        n = parseInt(value);\n      }\n      return isNaN(n) ? value : n;\n      // this code disabled because encoded values (like \"0xFFFF\")\n      // do not round trip to their original format\n      //return (String(floatVal) === value) ? floatVal : value;\n    },\n    object: function(value, currentValue) {\n      if (currentValue === null) {\n        return value;\n      }\n      try {\n        // If the string is an object, we can parse is with the JSON library.\n        // include convenience replace for single-quotes. If the author omits\n        // quotes altogether, parse will fail.\n        return JSON.parse(value.replace(/'/g, '\"'));\n      } catch(e) {\n        // The object isn't valid JSON, return the raw value\n        return value;\n      }\n    },\n    // avoid deserialization of functions\n    'function': function(value, currentValue) {\n      return currentValue;\n    }\n  };\n\n  function deserializeValue(value, currentValue) {\n    // attempt to infer type from default value\n    var inferredType = typeof currentValue;\n    // invent 'date' type value for Date\n    if (currentValue instanceof Date) {\n      inferredType = 'date';\n    }\n    // delegate deserialization via type string\n    return typeHandlers[inferredType](value, currentValue);\n  }\n\n  // exports\n\n  scope.deserializeValue = deserializeValue;\n\n})(Polymer);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope) {\n\n  // imports\n\n  var extend = scope.extend;\n\n  // module\n\n  var api = {};\n\n  api.declaration = {};\n  api.instance = {};\n\n  api.publish = function(apis, prototype) {\n    for (var n in apis) {\n      extend(prototype, apis[n]);\n    }\n  }\n\n  // exports\n\n  scope.api = api;\n\n})(Polymer);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope) {\n\n  var utils = {\n    /**\n      * Invokes a function asynchronously. The context of the callback\n      * function is bound to 'this' automatically.\n      * @method async\n      * @param {Function|String} method\n      * @param {any|Array} args\n      * @param {number} timeout\n      */\n    async: function(method, args, timeout) {\n      // when polyfilling Object.observe, ensure changes \n      // propagate before executing the async method\n      Platform.flush();\n      // second argument to `apply` must be an array\n      args = (args && args.length) ? args : [args];\n      // function to invoke\n      var fn = function() {\n        (this[method] || method).apply(this, args);\n      }.bind(this);\n      // execute `fn` sooner or later\n      var handle = timeout ? setTimeout(fn, timeout) :\n          requestAnimationFrame(fn);\n      // NOTE: switch on inverting handle to determine which time is used.\n      return timeout ? handle : ~handle;\n    },\n    cancelAsync: function(handle) {\n      if (handle < 0) {\n        cancelAnimationFrame(~handle);\n      } else {\n        clearTimeout(handle);\n      }\n    },\n    /**\n      * Fire an event.\n      * @method fire\n      * @returns {Object} event\n      * @param {string} type An event name.\n      * @param {any} detail\n      * @param {Node} onNode Target node.\n      */\n    fire: function(type, detail, onNode, bubbles, cancelable) {\n      var node = onNode || this;\n      var detail = detail || {};\n      var event = new CustomEvent(type, {\n        bubbles: (bubbles !== undefined ? bubbles : true), \n        cancelable: (cancelable !== undefined ? cancelable : true), \n        detail: detail\n      });\n      node.dispatchEvent(event);\n      return event;\n    },\n    /**\n      * Fire an event asynchronously.\n      * @method asyncFire\n      * @param {string} type An event name.\n      * @param detail\n      * @param {Node} toNode Target node.\n      */\n    asyncFire: function(/*inType, inDetail*/) {\n      this.async(\"fire\", arguments);\n    },\n    /**\n      * Remove class from old, add class to anew, if they exist\n      * @param classFollows\n      * @param anew A node.\n      * @param old A node\n      * @param className\n      */\n    classFollows: function(anew, old, className) {\n      if (old) {\n        old.classList.remove(className);\n      }\n      if (anew) {\n        anew.classList.add(className);\n      }\n    }\n  };\n\n  // no-operation function for handy stubs\n  var nop = function() {};\n\n  // null-object for handy stubs\n  var nob = {};\n\n  // deprecated\n\n  utils.asyncMethod = utils.async;\n\n  // exports\n\n  scope.api.instance.utils = utils;\n  scope.nop = nop;\n  scope.nob = nob;\n\n})(Polymer);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  var EVENT_PREFIX = 'on-';\n\n  // instance events api\n  var events = {\n    // read-only\n    EVENT_PREFIX: EVENT_PREFIX,\n    // event listeners on host\n    addHostListeners: function() {\n      var events = this.eventDelegates;\n      log.events && (Object.keys(events).length > 0) && console.log('[%s] addHostListeners:', this.localName, events);\n      // NOTE: host events look like bindings but really are not;\n      // (1) we don't want the attribute to be set and (2) we want to support\n      // multiple event listeners ('host' and 'instance') and Node.bind\n      // by default supports 1 thing being bound.\n      // We do, however, leverage the event hookup code in PolymerExpressions\n      // so that we have a common code path for handling declarative events.\n      var self = this, bindable, eventName;\n      for (var n in events) {\n        eventName = EVENT_PREFIX + n;\n        bindable = PolymerExpressions.prepareEventBinding(\n          Path.get(events[n]),\n          eventName, \n          {\n            resolveEventHandler: function(model, path, node) {\n              var fn = path.getValueFrom(self);\n              if (fn) {\n                return fn.bind(self);\n              }\n            }\n          }\n        );\n        bindable(this, this, false);\n      }\n    },\n    // call 'method' or function method on 'obj' with 'args', if the method exists\n    dispatchMethod: function(obj, method, args) {\n      if (obj) {\n        log.events && console.group('[%s] dispatch [%s]', obj.localName, method);\n        var fn = typeof method === 'function' ? method : obj[method];\n        if (fn) {\n          fn[args ? 'apply' : 'call'](obj, args);\n        }\n        log.events && console.groupEnd();\n        Platform.flush();\n      }\n    }\n  };\n\n  // exports\n\n  scope.api.instance.events = events;\n\n})(Polymer);\n","/*\r\n * Copyright 2013 The Polymer Authors. All rights reserved.\r\n * Use of this source code is governed by a BSD-style\r\n * license that can be found in the LICENSE file.\r\n */\r\n(function(scope) {\r\n\r\n  // instance api for attributes\r\n\r\n  var attributes = {\r\n    copyInstanceAttributes: function () {\r\n      var a$ = this._instanceAttributes;\r\n      for (var k in a$) {\r\n        if (!this.hasAttribute(k)) {\r\n          this.setAttribute(k, a$[k]);\r\n        }\r\n      }\r\n    },\r\n    // for each attribute on this, deserialize value to property as needed\r\n    takeAttributes: function() {\r\n      // if we have no publish lookup table, we have no attributes to take\r\n      // TODO(sjmiles): ad hoc\r\n      if (this._publishLC) {\r\n        for (var i=0, a$=this.attributes, l=a$.length, a; (a=a$[i]) && i<l; i++) {\r\n          this.attributeToProperty(a.name, a.value);\r\n        }\r\n      }\r\n    },\r\n    // if attribute 'name' is mapped to a property, deserialize\r\n    // 'value' into that property\r\n    attributeToProperty: function(name, value) {\r\n      // try to match this attribute to a property (attributes are\r\n      // all lower-case, so this is case-insensitive search)\r\n      var name = this.propertyForAttribute(name);\r\n      if (name) {\r\n        // filter out 'mustached' values, these are to be\r\n        // replaced with bound-data and are not yet values\r\n        // themselves\r\n        if (value && value.search(scope.bindPattern) >= 0) {\r\n          return;\r\n        }\r\n        // get original value\r\n        var currentValue = this[name];\r\n        // deserialize Boolean or Number values from attribute\r\n        var value = this.deserializeValue(value, currentValue);\r\n        // only act if the value has changed\r\n        if (value !== currentValue) {\r\n          // install new value (has side-effects)\r\n          this[name] = value;\r\n        }\r\n      }\r\n    },\r\n    // return the published property matching name, or undefined\r\n    propertyForAttribute: function(name) {\r\n      var match = this._publishLC && this._publishLC[name];\r\n      //console.log('propertyForAttribute:', name, 'matches', match);\r\n      return match;\r\n    },\r\n    // convert representation of 'stringValue' based on type of 'currentValue'\r\n    deserializeValue: function(stringValue, currentValue) {\r\n      return scope.deserializeValue(stringValue, currentValue);\r\n    },\r\n    serializeValue: function(value, inferredType) {\r\n      if (inferredType === 'boolean') {\r\n        return value ? '' : undefined;\r\n      } else if (inferredType !== 'object' && inferredType !== 'function'\r\n          && value !== undefined) {\r\n        return value;\r\n      }\r\n    },\r\n    reflectPropertyToAttribute: function(name) {\r\n      var inferredType = typeof this[name];\r\n      // try to intelligently serialize property value\r\n      var serializedValue = this.serializeValue(this[name], inferredType);\r\n      // boolean properties must reflect as boolean attributes\r\n      if (serializedValue !== undefined) {\r\n        this.setAttribute(name, serializedValue);\r\n        // TODO(sorvell): we should remove attr for all properties\r\n        // that have undefined serialization; however, we will need to\r\n        // refine the attr reflection system to achieve this; pica, for example,\r\n        // relies on having inferredType object properties not removed as\r\n        // attrs.\r\n      } else if (inferredType === 'boolean') {\r\n        this.removeAttribute(name);\r\n      }\r\n    }\r\n  };\r\n\r\n  // exports\r\n\r\n  scope.api.instance.attributes = attributes;\r\n\r\n})(Polymer);\r\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n\n  // magic words\n\n  var OBSERVE_SUFFIX = 'Changed';\n\n  // element api\n\n  var empty = [];\n\n  var properties = {\n    createPropertyObserver: function() {\n      var n$ = this._observeNames;\n      if (n$ && n$.length) {\n        var o = this._propertyObserver = new CompoundObserver(true);\n        this.registerObservers([o]);\n        // TODO(sorvell): may not be kosher to access the value here (this[n]);\n        // previously we looked at the descriptor on the prototype\n        // this doesn't work for inheritance and not for accessors without \n        // a value property\n        for (var i=0, l=n$.length, n; (i<l) && (n=n$[i]); i++) {\n          o.addPath(this, n);\n          this.observeArrayValue(n, this[n], null);\n        }\n      }\n    },\n    openPropertyObserver: function() {\n      if (this._propertyObserver) {\n        this._propertyObserver.open(this.notifyPropertyChanges, this);\n      }\n    },\n    notifyPropertyChanges: function(newValues, oldValues, paths) {\n      var name, method, called = {};\n      for (var i in oldValues) {\n        // note: paths is of form [object, path, object, path]\n        name = paths[2 * i + 1];\n        method = this.observe[name];\n        if (method) {\n          this.observeArrayValue(name, newValues[i], oldValues[i]);\n          if (!called[method]) {\n            called[method] = true;\n            // observes the value if it is an array\n            // TODO(sorvell): call method with the set of values it's expecting;\n            // e.g. 'foo bar': 'invalidate' expects the new and old values for\n            // foo and bar. Currently we give only one of these and then\n            // deliver all the arguments.\n            this.invokeMethod(method, [oldValues[i], newValues[i], arguments]);\n          }\n        }\n      }\n    },\n    propertyChanged_: function(name, value, oldValue) {\n      if (this.reflect[name]) {\n        this.reflectPropertyToAttribute(name);\n      }\n    },\n    observeArrayValue: function(name, value, old) {\n      // we only care if there are registered side-effects\n      var callbackName = this.observe[name];\n      if (callbackName) {\n        // if we are observing the previous value, stop\n        if (Array.isArray(old)) {\n          log.observe && console.log('[%s] observeArrayValue: unregister observer [%s]', this.localName, name);\n          this.closeNamedObserver(name + '__array');\n        }\n        // if the new value is an array, being observing it\n        if (Array.isArray(value)) {\n          log.observe && console.log('[%s] observeArrayValue: register observer [%s]', this.localName, name, value);\n          var observer = new ArrayObserver(value);\n          observer.open(function(value, old) {\n            this.invokeMethod(callbackName, [old]);\n          }, this);\n          this.registerNamedObserver(name + '__array', observer);\n        }\n      }\n    },\n    bindProperty: function(property, observable, oneTime) {\n      if (oneTime) {\n        this[property] = observable;\n        return;\n      }\n      return bindProperties(this, property, observable);\n    },\n    invokeMethod: function(method, args) {\n      var fn = this[method] || method;\n      if (typeof fn === 'function') {\n        fn.apply(this, args);\n      }\n    },\n    registerObservers: function(observers) {\n      this._observers = this._observers || [];\n      this._observers.push(observers);\n    },\n    // observer array items are arrays of observers.\n    closeObservers: function() {\n      for (var i=0, l=this._observers.length; i<l; i++) {\n        this.closeObserverArray(this._observers[i]);\n      }\n      this._observers = [];\n    },\n    closeObserverArray: function(observerArray) {\n      for (var i=0, l=observerArray.length, o; i<l; i++) {\n        o = observerArray[i];\n        if (o && o.close) {\n          o.close();\n        }\n      }\n    },\n    // bookkeeping observers for memory management\n    registerNamedObserver: function(name, observer) {\n      var o$ = this._namedObservers || (this._namedObservers = {});\n      o$[name] = observer;\n    },\n    closeNamedObserver: function(name) {\n      var o$ = this._namedObservers;\n      if (o$ && o$[name]) {\n        o$[name].close();\n        o$[name] = null;\n        return true;\n      }\n    },\n    closeNamedObservers: function() {\n      if (this._namedObservers) {\n        var keys=Object.keys(this._namedObservers);\n        for (var i=0, l=keys.length, k, o; (i < l) && (k=keys[i]); i++) {\n          o = this._namedObservers[k];\n          o.close();\n        }\n        this._namedObservers = {};\n      }\n    }\n  };\n\n  // property binding\n  // bind a property in A to a path in B by converting A[property] to a\n  // getter/setter pair that accesses B[...path...]\n  function bindProperties(inA, inProperty, observable) {\n    log.bind && console.log(LOG_BIND_PROPS, observable.path_, inPath, inA.localName, inProperty);\n    // apply Polymer two-way reference binding\n    return Observer.bindToInstance(inA, inProperty, observable, resolveBindingValue);\n  }\n\n  // capture A's value if B's value is null or undefined,\n  // otherwise use B's value\n  function resolveBindingValue(oldValue, value) {\n    return (value === null || value === undefined) ? oldValue : value;\n  }\n\n  // logging\n  var LOG_OBSERVE = '[%s] watching [%s]';\n  var LOG_OBSERVED = '[%s#%s] watch: [%s] now [%s] was [%s]';\n  var LOG_CHANGED = '[%s#%s] propertyChanged: [%s] now [%s] was [%s]';\n  var LOG_BIND_PROPS = \"[%s]: bindProperties: [%s] to [%s].[%s]\";\n\n  // exports\n\n  scope.api.instance.properties = properties;\n\n})(Polymer);","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || 0;\n\n  // element api supporting mdv\n  var mdv = {\n    instanceTemplate: function(template) {\n      // ensure a default bindingDelegate\n      var syntax = this.syntax || (!template.bindingDelegate &&\n          this.element.syntax);\n      var dom = template.createInstance(this, syntax);\n      this.registerObservers(dom.bindings_);\n      return dom;\n    },\n    bind: function(name, observable, oneTime) {\n      var property = this.propertyForAttribute(name);\n      if (!property) {\n        // TODO(sjmiles): this mixin method must use the special form\n        // of `super` installed by `mixinMethod` in declaration/prototype.js\n        return this.mixinSuper(arguments);\n      } else {\n        // use n-way Polymer binding\n        var observer = this.bindProperty(property, observable, oneTime);\n        // NOTE: reflecting binding information is typically required only for\n        // tooling. It has a performance cost so it's opt-in in Node.bind.\n        if (Platform.enableBindingsReflection && observer) {\n          observer.path = observable.path_;\n          this.bindings_ = this.bindings_ || {};\n          this.bindings_[property] = observer;\n        }\n        if (this.reflect[property]) {\n          this.reflectPropertyToAttribute(property);\n        }\n        return observer;\n      }\n    },\n    bindFinished: function() {\n      this.makeElementReady();\n    },\n    // TODO(sorvell): unbind/unbindAll has been removed, as public api, from\n    // TemplateBinding. We still need to close/dispose of observers but perhaps\n    // we should choose a more explicit name.\n    asyncUnbindAll: function() {\n      if (!this._unbound) {\n        log.unbind && console.log('[%s] asyncUnbindAll', this.localName);\n        this._unbindAllJob = this.job(this._unbindAllJob, this.unbindAll, 0);\n      }\n    },\n    unbindAll: function() {\n      if (!this._unbound) {\n        this.closeObservers();\n        this.closeNamedObservers();\n        this._unbound = true;\n      }\n    },\n    cancelUnbindAll: function() {\n      if (this._unbound) {\n        log.unbind && console.warn('[%s] already unbound, cannot cancel unbindAll', this.localName);\n        return;\n      }\n      log.unbind && console.log('[%s] cancelUnbindAll', this.localName);\n      if (this._unbindAllJob) {\n        this._unbindAllJob = this._unbindAllJob.stop();\n      }\n    }\n  };\n\n  function unbindNodeTree(node) {\n    forNodeTree(node, _nodeUnbindAll);\n  }\n\n  function _nodeUnbindAll(node) {\n    node.unbindAll();\n  }\n\n  function forNodeTree(node, callback) {\n    if (node) {\n      callback(node);\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        forNodeTree(child, callback);\n      }\n    }\n  }\n\n  var mustachePattern = /\\{\\{([^{}]*)}}/;\n\n  // exports\n\n  scope.bindPattern = mustachePattern;\n  scope.api.instance.mdv = mdv;\n\n})(Polymer);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope) {\n\n  var base = {\n    PolymerBase: true,\n    job: function(job, callback, wait) {\n      if (typeof job === 'string') {\n        var n = '___' + job;\n        this[n] = Polymer.job.call(this, this[n], callback, wait);\n      } else {\n        return Polymer.job.call(this, job, callback, wait);\n      }\n    },\n    super: Polymer.super,\n    // user entry point for element has had its createdCallback called\n    created: function() {\n    },\n    // user entry point for element has shadowRoot and is ready for\n    // api interaction\n    ready: function() {\n    },\n    createdCallback: function() {\n      if (this.templateInstance && this.templateInstance.model) {\n        console.warn('Attributes on ' + this.localName + ' were data bound ' +\n            'prior to Polymer upgrading the element. This may result in ' +\n            'incorrect binding types.');\n      }\n      this.created();\n      this.prepareElement();\n      // TODO(sorvell): replace when ShadowDOMPolyfill issue is corrected\n      // https://github.com/Polymer/ShadowDOM/issues/420\n      if (!this.ownerDocument.isStagingDocument || window.ShadowDOMPolyfill) {\n        this.makeElementReady();\n      }\n    },\n    // system entry point, do not override\n    prepareElement: function() {\n      if (this._elementPrepared) {\n        console.warn('Element already prepared', this.localName);\n        return;\n      }\n      this._elementPrepared = true;\n      // storage for shadowRoots info\n      this.shadowRoots = {};\n      // install property observers\n      this.createPropertyObserver();\n      // TODO (sorvell): temporarily open observer when created\n      this.openPropertyObserver();\n      // install boilerplate attributes\n      this.copyInstanceAttributes();\n      // process input attributes\n      this.takeAttributes();\n      // add event listeners\n      this.addHostListeners();\n    },\n    makeElementReady: function() {\n      if (this._readied) {\n        return;\n      }\n      this._readied = true;\n      // TODO(sorvell): We could create an entry point here\n      // for the user to compute property values.\n      // process declarative resources\n      this.parseDeclarations(this.__proto__);\n      // TODO(sorvell): CE polyfill uses unresolved attribute to simulate\n      // :unresolved; remove this attribute to be compatible with native\n      // CE.\n      this.removeAttribute('unresolved');\n      // user entry point\n      this.ready();\n      // TODO (sorvell): temporarily open observer when created\n      // turn on property observation and take any initial changes\n      //this.openPropertyObserver();\n    },\n    attachedCallback: function() {\n      this.cancelUnbindAll();\n      // invoke user action\n      if (this.attached) {\n        this.attached();\n      }\n      // TODO(sorvell): bc\n      if (this.enteredView) {\n        this.enteredView();\n      }\n      // NOTE: domReady can be used to access elements in dom (descendants, \n      // ancestors, siblings) such that the developer is enured to upgrade\n      // ordering. If the element definitions have loaded, domReady\n      // can be used to access upgraded elements.\n      if (!this.hasBeenAttached) {\n        this.hasBeenAttached = true;\n        if (this.domReady) {\n          this.async('domReady');\n        }\n      }\n    },\n    detachedCallback: function() {\n      if (!this.preventDispose) {\n        this.asyncUnbindAll();\n      }\n      // invoke user action\n      if (this.detached) {\n        this.detached();\n      }\n      // TODO(sorvell): bc\n      if (this.leftView) {\n        this.leftView();\n      }\n    },\n    // TODO(sorvell): bc\n    enteredViewCallback: function() {\n      this.attachedCallback();\n    },\n    // TODO(sorvell): bc\n    leftViewCallback: function() {\n      this.detachedCallback();\n    },\n    // TODO(sorvell): bc\n    enteredDocumentCallback: function() {\n      this.attachedCallback();\n    },\n    // TODO(sorvell): bc\n    leftDocumentCallback: function() {\n      this.detachedCallback();\n    },\n    // recursive ancestral <element> initialization, oldest first\n    parseDeclarations: function(p) {\n      if (p && p.element) {\n        this.parseDeclarations(p.__proto__);\n        p.parseDeclaration.call(this, p.element);\n      }\n    },\n    // parse input <element> as needed, override for custom behavior\n    parseDeclaration: function(elementElement) {\n      var template = this.fetchTemplate(elementElement);\n      if (template) {\n        var root = this.shadowFromTemplate(template);\n        this.shadowRoots[elementElement.name] = root;\n      }\n    },\n    // return a shadow-root template (if desired), override for custom behavior\n    fetchTemplate: function(elementElement) {\n      return elementElement.querySelector('template');\n    },\n    // utility function that creates a shadow root from a <template>\n    shadowFromTemplate: function(template) {\n      if (template) {\n        // make a shadow root\n        var root = this.createShadowRoot();\n        // stamp template\n        // which includes parsing and applying MDV bindings before being \n        // inserted (to avoid {{}} in attribute values)\n        // e.g. to prevent <img src=\"images/{{icon}}\"> from generating a 404.\n        var dom = this.instanceTemplate(template);\n        // append to shadow dom\n        root.appendChild(dom);\n        // perform post-construction initialization tasks on shadow root\n        this.shadowRootReady(root, template);\n        // return the created shadow root\n        return root;\n      }\n    },\n    // utility function that stamps a <template> into light-dom\n    lightFromTemplate: function(template, refNode) {\n      if (template) {\n        // TODO(sorvell): mark this element as a lightDOMController so that\n        // event listeners on bound nodes inside it will be called on it.\n        // Note, the expectation here is that events on all descendants \n        // should be handled by this element.\n        this.lightDomController = true;\n        // stamp template\n        // which includes parsing and applying MDV bindings before being \n        // inserted (to avoid {{}} in attribute values)\n        // e.g. to prevent <img src=\"images/{{icon}}\"> from generating a 404.\n        var dom = this.instanceTemplate(template);\n        // append to shadow dom\n        if (refNode) {\n          this.insertBefore(dom, refNode);          \n        } else {\n          this.appendChild(dom);\n        }\n        // perform post-construction initialization tasks on ahem, light root\n        this.shadowRootReady(this);\n        // return the created shadow root\n        return dom;\n      }\n    },\n    shadowRootReady: function(root) {\n      // locate nodes with id and store references to them in this.$ hash\n      this.marshalNodeReferences(root);\n      // set up polymer gestures\n      PolymerGestures.register(root);\n    },\n    // locate nodes with id and store references to them in this.$ hash\n    marshalNodeReferences: function(root) {\n      // establish $ instance variable\n      var $ = this.$ = this.$ || {};\n      // populate $ from nodes with ID from the LOCAL tree\n      if (root) {\n        var n$ = root.querySelectorAll(\"[id]\");\n        for (var i=0, l=n$.length, n; (i<l) && (n=n$[i]); i++) {\n          $[n.id] = n;\n        };\n      }\n    },\n    attributeChangedCallback: function(name, oldValue) {\n      // TODO(sjmiles): adhoc filter\n      if (name !== 'class' && name !== 'style') {\n        this.attributeToProperty(name, this.getAttribute(name));\n      }\n      if (this.attributeChanged) {\n        this.attributeChanged.apply(this, arguments);\n      }\n    },\n    onMutation: function(node, listener) {\n      var observer = new MutationObserver(function(mutations) {\n        listener.call(this, observer, mutations);\n        observer.disconnect();\n      }.bind(this));\n      observer.observe(node, {childList: true, subtree: true});\n    }\n  };\n\n  // true if object has own PolymerBase api\n  function isBase(object) {\n    return object.hasOwnProperty('PolymerBase') \n  }\n\n  // name a base constructor for dev tools\n\n  function PolymerBase() {};\n  PolymerBase.prototype = base;\n  base.constructor = PolymerBase;\n  \n  // exports\n\n  scope.Base = PolymerBase;\n  scope.isBase = isBase;\n  scope.api.instance.base = base;\n  \n})(Polymer);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  \n  // magic words\n  \n  var STYLE_SCOPE_ATTRIBUTE = 'element';\n  var STYLE_CONTROLLER_SCOPE = 'controller';\n  \n  var styles = {\n    STYLE_SCOPE_ATTRIBUTE: STYLE_SCOPE_ATTRIBUTE,\n    /**\n     * Installs external stylesheets and <style> elements with the attribute \n     * polymer-scope='controller' into the scope of element. This is intended\n     * to be a called during custom element construction.\n    */\n    installControllerStyles: function() {\n      // apply controller styles, but only if they are not yet applied\n      var scope = this.findStyleScope();\n      if (scope && !this.scopeHasNamedStyle(scope, this.localName)) {\n        // allow inherited controller styles\n        var proto = getPrototypeOf(this), cssText = '';\n        while (proto && proto.element) {\n          cssText += proto.element.cssTextForScope(STYLE_CONTROLLER_SCOPE);\n          proto = getPrototypeOf(proto);\n        }\n        if (cssText) {\n          this.installScopeCssText(cssText, scope);\n        }\n      }\n    },\n    installScopeStyle: function(style, name, scope) {\n      var scope = scope || this.findStyleScope(), name = name || '';\n      if (scope && !this.scopeHasNamedStyle(scope, this.localName + name)) {\n        var cssText = '';\n        if (style instanceof Array) {\n          for (var i=0, l=style.length, s; (i<l) && (s=style[i]); i++) {\n            cssText += s.textContent + '\\n\\n';\n          }\n        } else {\n          cssText = style.textContent;\n        }\n        this.installScopeCssText(cssText, scope, name);\n      }\n    },\n    installScopeCssText: function(cssText, scope, name) {\n      scope = scope || this.findStyleScope();\n      name = name || '';\n      if (!scope) {\n        return;\n      }\n      if (window.ShadowDOMPolyfill) {\n        cssText = shimCssText(cssText, scope.host);\n      }\n      var style = this.element.cssTextToScopeStyle(cssText,\n          STYLE_CONTROLLER_SCOPE);\n      Polymer.applyStyleToScope(style, scope);\n      // cache that this style has been applied\n      scope._scopeStyles[this.localName + name] = true;\n    },\n    findStyleScope: function(node) {\n      // find the shadow root that contains this element\n      var n = node || this;\n      while (n.parentNode) {\n        n = n.parentNode;\n      }\n      return n;\n    },\n    scopeHasNamedStyle: function(scope, name) {\n      scope._scopeStyles = scope._scopeStyles || {};\n      return scope._scopeStyles[name];\n    }\n  };\n  \n  // NOTE: use raw prototype traversal so that we ensure correct traversal\n  // on platforms where the protoype chain is simulated via __proto__ (IE10)\n  function getPrototypeOf(prototype) {\n    return prototype.__proto__;\n  }\n\n  function shimCssText(cssText, host) {\n    var name = '', is = false;\n    if (host) {\n      name = host.localName;\n      is = host.hasAttribute('is');\n    }\n    var selector = Platform.ShadowCSS.makeScopeSelector(name, is);\n    return Platform.ShadowCSS.shimCssText(cssText, selector);\n  }\n\n  // exports\n\n  scope.api.instance.styles = styles;\n  \n})(Polymer);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope) {\n\n  // imports\n\n  var extend = scope.extend;\n  var api = scope.api;\n\n  // imperative implementation: Polymer()\n\n  // specify an 'own' prototype for tag `name`\n  function element(name, prototype) {\n    if (arguments.length === 1 && typeof arguments[0] !== 'string') {\n      prototype = name;\n      var script = document._currentScript;\n      name = script && script.parentNode && script.parentNode.getAttribute ?\n          script.parentNode.getAttribute('name') : '';\n      if (!name) {\n        throw 'Element name could not be inferred.';\n      }\n    }\n    if (getRegisteredPrototype[name]) {\n      throw 'Already registered (Polymer) prototype for element ' + name;\n    }\n    // cache the prototype\n    registerPrototype(name, prototype);\n    // notify the registrar waiting for 'name', if any\n    notifyPrototype(name);\n  }\n\n  // async prototype source\n\n  function waitingForPrototype(name, client) {\n    waitPrototype[name] = client;\n  }\n\n  var waitPrototype = {};\n\n  function notifyPrototype(name) {\n    if (waitPrototype[name]) {\n      waitPrototype[name].registerWhenReady();\n      delete waitPrototype[name];\n    }\n  }\n\n  // utility and bookkeeping\n\n  // maps tag names to prototypes, as registered with\n  // Polymer. Prototypes associated with a tag name\n  // using document.registerElement are available from\n  // HTMLElement.getPrototypeForTag().\n  // If an element was fully registered by Polymer, then\n  // Polymer.getRegisteredPrototype(name) === \n  //   HTMLElement.getPrototypeForTag(name)\n\n  var prototypesByName = {};\n\n  function registerPrototype(name, prototype) {\n    return prototypesByName[name] = prototype || {};\n  }\n\n  function getRegisteredPrototype(name) {\n    return prototypesByName[name];\n  }\n\n  // exports\n\n  scope.getRegisteredPrototype = getRegisteredPrototype;\n  scope.waitingForPrototype = waitingForPrototype;\n\n  // namespace shenanigans so we can expose our scope on the registration \n  // function\n\n  // make window.Polymer reference `element()`\n\n  window.Polymer = element;\n\n  // TODO(sjmiles): find a way to do this that is less terrible\n  // copy window.Polymer properties onto `element()`\n\n  extend(Polymer, scope);\n\n  // Under the HTMLImports polyfill, scripts in the main document\n  // do not block on imports; we want to allow calls to Polymer in the main\n  // document. Platform collects those calls until we can process them, which\n  // we do here.\n\n  var declarations = Platform.deliverDeclarations();\n  if (declarations) {\n    for (var i=0, l=declarations.length, d; (i<l) && (d=declarations[i]); i++) {\n      element.apply(null, d);\n    }\n  }\n\n})(Polymer);\n","/* \n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\nvar path = {\n  resolveElementPaths: function(node) {\n    Platform.urlResolver.resolveDom(node);\n  },\n  addResolvePathApi: function() {\n    // let assetpath attribute modify the resolve path\n    var assetPath = this.getAttribute('assetpath') || '';\n    var root = new URL(assetPath, this.ownerDocument.baseURI);\n    this.prototype.resolvePath = function(urlPath, base) {\n      var u = new URL(urlPath, base || root);\n      return u.href;\n    };\n  }\n};\n\n// exports\nscope.api.declaration.path = path;\n\n})(Polymer);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  var api = scope.api.instance.styles;\n  var STYLE_SCOPE_ATTRIBUTE = api.STYLE_SCOPE_ATTRIBUTE;\n\n  // magic words\n\n  var STYLE_SELECTOR = 'style';\n  var STYLE_LOADABLE_MATCH = '@import';\n  var SHEET_SELECTOR = 'link[rel=stylesheet]';\n  var STYLE_GLOBAL_SCOPE = 'global';\n  var SCOPE_ATTR = 'polymer-scope';\n\n  var styles = {\n    // returns true if resources are loading\n    loadStyles: function(callback) {\n      var content = this.templateContent();\n      if (content) {\n        this.convertSheetsToStyles(content);\n      }\n      var styles = this.findLoadableStyles(content);\n      if (styles.length) {\n        Platform.styleResolver.loadStyles(styles, callback);\n      } else if (callback) {\n        callback();\n      }\n    },\n    convertSheetsToStyles: function(root) {\n      var s$ = root.querySelectorAll(SHEET_SELECTOR);\n      for (var i=0, l=s$.length, s, c; (i<l) && (s=s$[i]); i++) {\n        c = createStyleElement(importRuleForSheet(s, this.ownerDocument.baseURI),\n            this.ownerDocument);\n        this.copySheetAttributes(c, s);\n        s.parentNode.replaceChild(c, s);\n      }\n    },\n    copySheetAttributes: function(style, link) {\n      for (var i=0, a$=link.attributes, l=a$.length, a; (a=a$[i]) && i<l; i++) {\n        if (a.name !== 'rel' && a.name !== 'href') {\n          style.setAttribute(a.name, a.value);\n        }\n      }\n    },\n    findLoadableStyles: function(root) {\n      var loadables = [];\n      if (root) {\n        var s$ = root.querySelectorAll(STYLE_SELECTOR);\n        for (var i=0, l=s$.length, s; (i<l) && (s=s$[i]); i++) {\n          if (s.textContent.match(STYLE_LOADABLE_MATCH)) {\n            loadables.push(s);\n          }\n        }\n      }\n      return loadables;\n    },\n    /**\n     * Install external stylesheets loaded in <polymer-element> elements into the \n     * element's template.\n     * @param elementElement The <element> element to style.\n     */\n    installSheets: function() {\n      this.cacheSheets();\n      this.cacheStyles();\n      this.installLocalSheets();\n      this.installGlobalStyles();\n    },\n    /**\n     * Remove all sheets from element and store for later use.\n     */\n    cacheSheets: function() {\n      this.sheets = this.findNodes(SHEET_SELECTOR);\n      this.sheets.forEach(function(s) {\n        if (s.parentNode) {\n          s.parentNode.removeChild(s);\n        }\n      });\n    },\n    cacheStyles: function() {\n      this.styles = this.findNodes(STYLE_SELECTOR + '[' + SCOPE_ATTR + ']');\n      this.styles.forEach(function(s) {\n        if (s.parentNode) {\n          s.parentNode.removeChild(s);\n        }\n      });\n    },\n    /**\n     * Takes external stylesheets loaded in an <element> element and moves\n     * their content into a <style> element inside the <element>'s template.\n     * The sheet is then removed from the <element>. This is done only so \n     * that if the element is loaded in the main document, the sheet does\n     * not become active.\n     * Note, ignores sheets with the attribute 'polymer-scope'.\n     * @param elementElement The <element> element to style.\n     */\n    installLocalSheets: function () {\n      var sheets = this.sheets.filter(function(s) {\n        return !s.hasAttribute(SCOPE_ATTR);\n      });\n      var content = this.templateContent();\n      if (content) {\n        var cssText = '';\n        sheets.forEach(function(sheet) {\n          cssText += cssTextFromSheet(sheet) + '\\n';\n        });\n        if (cssText) {\n          var style = createStyleElement(cssText, this.ownerDocument);\n          content.insertBefore(style, content.firstChild);\n        }\n      }\n    },\n    findNodes: function(selector, matcher) {\n      var nodes = this.querySelectorAll(selector).array();\n      var content = this.templateContent();\n      if (content) {\n        var templateNodes = content.querySelectorAll(selector).array();\n        nodes = nodes.concat(templateNodes);\n      }\n      return matcher ? nodes.filter(matcher) : nodes;\n    },\n    /**\n     * Promotes external stylesheets and <style> elements with the attribute \n     * polymer-scope='global' into global scope.\n     * This is particularly useful for defining @keyframe rules which \n     * currently do not function in scoped or shadow style elements.\n     * (See wkb.ug/72462)\n     * @param elementElement The <element> element to style.\n    */\n    // TODO(sorvell): remove when wkb.ug/72462 is addressed.\n    installGlobalStyles: function() {\n      var style = this.styleForScope(STYLE_GLOBAL_SCOPE);\n      applyStyleToScope(style, document.head);\n    },\n    cssTextForScope: function(scopeDescriptor) {\n      var cssText = '';\n      // handle stylesheets\n      var selector = '[' + SCOPE_ATTR + '=' + scopeDescriptor + ']';\n      var matcher = function(s) {\n        return matchesSelector(s, selector);\n      };\n      var sheets = this.sheets.filter(matcher);\n      sheets.forEach(function(sheet) {\n        cssText += cssTextFromSheet(sheet) + '\\n\\n';\n      });\n      // handle cached style elements\n      var styles = this.styles.filter(matcher);\n      styles.forEach(function(style) {\n        cssText += style.textContent + '\\n\\n';\n      });\n      return cssText;\n    },\n    styleForScope: function(scopeDescriptor) {\n      var cssText = this.cssTextForScope(scopeDescriptor);\n      return this.cssTextToScopeStyle(cssText, scopeDescriptor);\n    },\n    cssTextToScopeStyle: function(cssText, scopeDescriptor) {\n      if (cssText) {\n        var style = createStyleElement(cssText);\n        style.setAttribute(STYLE_SCOPE_ATTRIBUTE, this.getAttribute('name') +\n            '-' + scopeDescriptor);\n        return style;\n      }\n    }\n  };\n\n  function importRuleForSheet(sheet, baseUrl) {\n    var href = new URL(sheet.getAttribute('href'), baseUrl).href;\n    return '@import \\'' + href + '\\';';\n  }\n\n  function applyStyleToScope(style, scope) {\n    if (style) {\n      if (scope === document) {\n        scope = document.head;\n      }\n      if (window.ShadowDOMPolyfill) {\n        scope = document.head;\n      }\n      // TODO(sorvell): necessary for IE\n      // see https://connect.microsoft.com/IE/feedback/details/790212/\n      // cloning-a-style-element-and-adding-to-document-produces\n      // -unexpected-result#details\n      // var clone = style.cloneNode(true);\n      var clone = createStyleElement(style.textContent);\n      var attr = style.getAttribute(STYLE_SCOPE_ATTRIBUTE);\n      if (attr) {\n        clone.setAttribute(STYLE_SCOPE_ATTRIBUTE, attr);\n      }\n      // TODO(sorvell): probably too brittle; try to figure out \n      // where to put the element.\n      var refNode = scope.firstElementChild;\n      if (scope === document.head) {\n        var selector = 'style[' + STYLE_SCOPE_ATTRIBUTE + ']';\n        var s$ = document.head.querySelectorAll(selector);\n        if (s$.length) {\n          refNode = s$[s$.length-1].nextElementSibling;\n        }\n      }\n      scope.insertBefore(clone, refNode);\n    }\n  }\n\n  function createStyleElement(cssText, scope) {\n    scope = scope || document;\n    scope = scope.createElement ? scope : scope.ownerDocument;\n    var style = scope.createElement('style');\n    style.textContent = cssText;\n    return style;\n  }\n\n  function cssTextFromSheet(sheet) {\n    return (sheet && sheet.__resource) || '';\n  }\n\n  function matchesSelector(node, inSelector) {\n    if (matches) {\n      return matches.call(node, inSelector);\n    }\n  }\n  var p = HTMLElement.prototype;\n  var matches = p.matches || p.matchesSelector || p.webkitMatchesSelector \n      || p.mozMatchesSelector;\n  \n  // exports\n\n  scope.api.declaration.styles = styles;\n  scope.applyStyleToScope = applyStyleToScope;\n  \n})(Polymer);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  var api = scope.api.instance.events;\n  var EVENT_PREFIX = api.EVENT_PREFIX;\n  // polymer-element declarative api: events feature\n\n  var events = { \n    parseHostEvents: function() {\n      // our delegates map\n      var delegates = this.prototype.eventDelegates;\n      // extract data from attributes into delegates\n      this.addAttributeDelegates(delegates);\n    },\n    addAttributeDelegates: function(delegates) {\n      // for each attribute\n      for (var i=0, a; a=this.attributes[i]; i++) {\n        // does it have magic marker identifying it as an event delegate?\n        if (this.hasEventPrefix(a.name)) {\n          // if so, add the info to delegates\n          delegates[this.removeEventPrefix(a.name)] = a.value.replace('{{', '')\n              .replace('}}', '').trim();\n        }\n      }\n    },\n    // starts with 'on-'\n    hasEventPrefix: function (n) {\n      return n && (n[0] === 'o') && (n[1] === 'n') && (n[2] === '-');\n    },\n    removeEventPrefix: function(n) {\n      return n.slice(prefixLength);\n    }\n  };\n\n  var prefixLength = EVENT_PREFIX.length;\n\n  // exports\n  scope.api.declaration.events = events;\n\n})(Polymer);","/*\r\n * Copyright 2013 The Polymer Authors. All rights reserved.\r\n * Use of this source code is governed by a BSD-style\r\n * license that can be found in the LICENSE file.\r\n */\r\n(function(scope) {\r\n\r\n  // element api\r\n\r\n  var properties = {\r\n    inferObservers: function(prototype) {\r\n      // called before prototype.observe is chained to inherited object\r\n      var observe = prototype.observe, property;\r\n      for (var n in prototype) {\r\n        if (n.slice(-7) === 'Changed') {\r\n          if (!observe) {\r\n            observe  = (prototype.observe = {});\r\n          }\r\n          property = n.slice(0, -7)\r\n          observe[property] = observe[property] || n;\r\n        }\r\n      }\r\n    },\r\n    explodeObservers: function(prototype) {\r\n      // called before prototype.observe is chained to inherited object\r\n      var o = prototype.observe;\r\n      if (o) {\r\n        var exploded = {};\r\n        for (var n in o) {\r\n          var names = n.split(' ');\r\n          for (var i=0, ni; ni=names[i]; i++) {\r\n            exploded[ni] = o[n];\r\n          }\r\n        }\r\n        prototype.observe = exploded;\r\n      }\r\n    },\r\n    optimizePropertyMaps: function(prototype) {\r\n      if (prototype.observe) {\r\n        // construct name list\r\n        var a = prototype._observeNames = [];\r\n        for (var n in prototype.observe) {\r\n          var names = n.split(' ');\r\n          for (var i=0, ni; ni=names[i]; i++) {\r\n            a.push(ni);\r\n          }\r\n        }\r\n      }\r\n      if (prototype.publish) {\r\n        // construct name list\r\n        var a = prototype._publishNames = [];\r\n        for (var n in prototype.publish) {\r\n          a.push(n);\r\n        }\r\n      }\r\n    },\r\n    publishProperties: function(prototype, base) {\r\n      // if we have any properties to publish\r\n      var publish = prototype.publish;\r\n      if (publish) {\r\n        // transcribe `publish` entries onto own prototype\r\n        this.requireProperties(publish, prototype, base);\r\n        // construct map of lower-cased property names\r\n        prototype._publishLC = this.lowerCaseMap(publish);\r\n      }\r\n    },\r\n    requireProperties: function(properties, prototype, base) {\r\n      // reflected properties\r\n      prototype.reflect = prototype.reflect || {};\r\n      // ensure a prototype value for each property\r\n      for (var n in properties) {\r\n        if (this.valueReflects(properties[n])) {\r\n          prototype.reflect[n] = true;\r\n        }\r\n        if (prototype[n] === undefined && base[n] === undefined) {\r\n          prototype[n] =  this.valueForProperty(properties[n]); \r\n        }\r\n      }\r\n    },\r\n    valueForProperty: function(propertyValue) {\r\n      return (typeof propertyValue === 'object' && propertyValue !== null) ? \r\n          (propertyValue.value !== undefined ? propertyValue.value : null) :\r\n          propertyValue;\r\n    },\r\n    valueReflects: function(propertyValue) {\r\n      return (typeof propertyValue === 'object' && propertyValue !== null && \r\n        propertyValue.reflect);\r\n    },\r\n    lowerCaseMap: function(properties) {\r\n      var map = {};\r\n      for (var n in properties) {\r\n        map[n.toLowerCase()] = n;\r\n      }\r\n      return map;\r\n    },\r\n    createPropertyAccessors: function(prototype) {\r\n      var n$ = prototype._publishNames;\r\n      if (n$ && n$.length) {\r\n        for (var i=0, l=n$.length, n, fn; (i<l) && (n=n$[i]); i++) {\r\n          Observer.createBindablePrototypeAccessor(prototype, n);\r\n        }\r\n      }\r\n    }\r\n  };\r\n\r\n  // exports\r\n\r\n  scope.api.declaration.properties = properties;\r\n\r\n})(Polymer);\r\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope) {\n\n  // magic words\n\n  var ATTRIBUTES_ATTRIBUTE = 'attributes';\n  var ATTRIBUTES_REGEX = /\\s|,/;\n\n  // attributes api\n\n  var attributes = {\n    inheritAttributesObjects: function(prototype) {\n      // chain our lower-cased publish map to the inherited version\n      this.inheritObject(prototype, 'publishLC');\n      // chain our instance attributes map to the inherited version\n      this.inheritObject(prototype, '_instanceAttributes');\n    },\n    publishAttributes: function(prototype, base) {\n      // merge names from 'attributes' attribute\n      var attributes = this.getAttribute(ATTRIBUTES_ATTRIBUTE);\n      if (attributes) {\n        // get properties to publish\n        var publish = prototype.publish || (prototype.publish = {});\n        // names='a b c' or names='a,b,c'\n        var names = attributes.split(ATTRIBUTES_REGEX);\n        // record each name for publishing\n        for (var i=0, l=names.length, n; i<l; i++) {\n          // remove excess ws\n          n = names[i].trim();\n          // do not override explicit entries\n          if (n && publish[n] === undefined && base[n] === undefined) {\n            publish[n] = null;\n          }\n        }\n      }\n    },\n    // record clonable attributes from <element>\n    accumulateInstanceAttributes: function() {\n      // inherit instance attributes\n      var clonable = this.prototype._instanceAttributes;\n      // merge attributes from element\n      var a$ = this.attributes;\n      for (var i=0, l=a$.length, a; (i<l) && (a=a$[i]); i++) {  \n        if (this.isInstanceAttribute(a.name)) {\n          clonable[a.name] = a.value;\n        }\n      }\n    },\n    isInstanceAttribute: function(name) {\n      return !this.blackList[name] && name.slice(0,3) !== 'on-';\n    },\n    // do not clone these attributes onto instances\n    blackList: {\n      name: 1,\n      'extends': 1,\n      constructor: 1,\n      noscript: 1,\n      assetpath: 1,\n      'cache-csstext': 1\n    }\n  };\n\n  // add ATTRIBUTES_ATTRIBUTE to the blacklist\n  attributes.blackList[ATTRIBUTES_ATTRIBUTE] = 1;\n\n  // exports\n\n  scope.api.declaration.attributes = attributes;\n\n})(Polymer);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope) {\n\n  // imports\n\n  var syntax = new PolymerExpressions();\n  syntax.resolveEventHandler = function(model, path, node) {\n    var ctlr = findEventController(node);\n    if (ctlr) {\n      var fn = path.getValueFrom(ctlr);\n      if (fn) {\n        return fn.bind(ctlr);\n      }\n    }\n  };\n\n  // An event controller is the host element for the shadowRoot in which \n  // the node exists, or the first ancestor with a 'lightDomController'\n  // property.\n  function findEventController(node) {\n    while (node.parentNode) {\n      if (node.lightDomController) {\n        return node;\n      }\n      node = node.parentNode;\n    }\n    return node.host;\n  }\n\n  // declaration api supporting mdv\n  var mdv = {\n    syntax: syntax,\n    fetchTemplate: function() {\n      return this.querySelector('template');\n    },\n    templateContent: function() {\n      var template = this.fetchTemplate();\n      return template && templateContent(template);\n    },\n    installBindingDelegate: function(template) {\n      if (template) {\n        template.bindingDelegate = this.syntax;\n      }\n    }\n  };\n\n  // exports\n  scope.api.declaration.mdv = mdv;\n\n})(Polymer);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope) {\n\n  // imports\n  \n  var api = scope.api;\n  var isBase = scope.isBase;\n  var extend = scope.extend;\n\n  // prototype api\n\n  var prototype = {\n\n    register: function(name, extendeeName) {\n      // build prototype combining extendee, Polymer base, and named api\n      this.buildPrototype(name, extendeeName);\n      // register our custom element with the platform\n      this.registerPrototype(name, extendeeName);\n      // reference constructor in a global named by 'constructor' attribute\n      this.publishConstructor();\n    },\n\n    buildPrototype: function(name, extendeeName) {\n      // get our custom prototype (before chaining)\n      var extension = scope.getRegisteredPrototype(name);\n      // get basal prototype\n      var base = this.generateBasePrototype(extendeeName);\n      // implement declarative features\n      this.desugarBeforeChaining(extension, base);\n      // join prototypes\n      this.prototype = this.chainPrototypes(extension, base);\n      // more declarative features\n      this.desugarAfterChaining(name, extendeeName);\n    },\n\n    desugarBeforeChaining: function(prototype, base) {\n      // back reference declaration element\n      // TODO(sjmiles): replace `element` with `elementElement` or `declaration`\n      prototype.element = this;\n      // transcribe `attributes` declarations onto own prototype's `publish`\n      this.publishAttributes(prototype, base);\n      // `publish` properties to the prototype and to attribute watch\n      this.publishProperties(prototype, base);\n      // infer observers for `observe` list based on method names\n      this.inferObservers(prototype);\n      // desugar compound observer syntax, e.g. 'a b c' \n      this.explodeObservers(prototype);\n    },\n\n    chainPrototypes: function(prototype, base) {\n      // chain various meta-data objects to inherited versions\n      this.inheritMetaData(prototype, base);\n      // chain custom api to inherited\n      var chained = this.chainObject(prototype, base);\n      // x-platform fixup\n      ensurePrototypeTraversal(chained);\n      return chained;\n    },\n\n    inheritMetaData: function(prototype, base) {\n      // chain observe object to inherited\n      this.inheritObject('observe', prototype, base);\n      // chain publish object to inherited\n      this.inheritObject('publish', prototype, base);\n      // chain reflect object to inherited\n      this.inheritObject('reflect', prototype, base);\n      // chain our lower-cased publish map to the inherited version\n      this.inheritObject('_publishLC', prototype, base);\n      // chain our instance attributes map to the inherited version\n      this.inheritObject('_instanceAttributes', prototype, base);\n      // chain our event delegates map to the inherited version\n      this.inheritObject('eventDelegates', prototype, base);\n    },\n\n    // implement various declarative features\n    desugarAfterChaining: function(name, extendee) {\n      // build side-chained lists to optimize iterations\n      this.optimizePropertyMaps(this.prototype);\n      this.createPropertyAccessors(this.prototype);\n      // install mdv delegate on template\n      this.installBindingDelegate(this.fetchTemplate());\n      // install external stylesheets as if they are inline\n      this.installSheets();\n      // adjust any paths in dom from imports\n      this.resolveElementPaths(this);\n      // compile list of attributes to copy to instances\n      this.accumulateInstanceAttributes();\n      // parse on-* delegates declared on `this` element\n      this.parseHostEvents();\n      //\n      // install a helper method this.resolvePath to aid in \n      // setting resource urls. e.g.\n      // this.$.image.src = this.resolvePath('images/foo.png')\n      this.addResolvePathApi();\n      // under ShadowDOMPolyfill, transforms to approximate missing CSS features\n      if (window.ShadowDOMPolyfill) {\n        Platform.ShadowCSS.shimStyling(this.templateContent(), name, extendee);\n      }\n      // allow custom element access to the declarative context\n      if (this.prototype.registerCallback) {\n        this.prototype.registerCallback(this);\n      }\n    },\n\n    // if a named constructor is requested in element, map a reference\n    // to the constructor to the given symbol\n    publishConstructor: function() {\n      var symbol = this.getAttribute('constructor');\n      if (symbol) {\n        window[symbol] = this.ctor;\n      }\n    },\n\n    // build prototype combining extendee, Polymer base, and named api\n    generateBasePrototype: function(extnds) {\n      var prototype = this.findBasePrototype(extnds);\n      if (!prototype) {\n        // create a prototype based on tag-name extension\n        var prototype = HTMLElement.getPrototypeForTag(extnds);\n        // insert base api in inheritance chain (if needed)\n        prototype = this.ensureBaseApi(prototype);\n        // memoize this base\n        memoizedBases[extnds] = prototype;\n      }\n      return prototype;\n    },\n\n    findBasePrototype: function(name) {\n      return memoizedBases[name];\n    },\n\n    // install Polymer instance api into prototype chain, as needed \n    ensureBaseApi: function(prototype) {\n      if (prototype.PolymerBase) {\n        return prototype;\n      }\n      var extended = Object.create(prototype);\n      // we need a unique copy of base api for each base prototype\n      // therefore we 'extend' here instead of simply chaining\n      api.publish(api.instance, extended);\n      // TODO(sjmiles): sharing methods across prototype chains is\n      // not supported by 'super' implementation which optimizes\n      // by memoizing prototype relationships.\n      // Probably we should have a version of 'extend' that is \n      // share-aware: it could study the text of each function,\n      // look for usage of 'super', and wrap those functions in\n      // closures.\n      // As of now, there is only one problematic method, so \n      // we just patch it manually.\n      // To avoid re-entrancy problems, the special super method\n      // installed is called `mixinSuper` and the mixin method\n      // must use this method instead of the default `super`.\n      this.mixinMethod(extended, prototype, api.instance.mdv, 'bind');\n      // return buffed-up prototype\n      return extended;\n    },\n\n    mixinMethod: function(extended, prototype, api, name) {\n      var $super = function(args) {\n        return prototype[name].apply(this, args);\n      };\n      extended[name] = function() {\n        this.mixinSuper = $super;\n        return api[name].apply(this, arguments);\n      }\n    },\n\n    // ensure prototype[name] inherits from a prototype.prototype[name]\n    inheritObject: function(name, prototype, base) {\n      // require an object\n      var source = prototype[name] || {};\n      // chain inherited properties onto a new object\n      prototype[name] = this.chainObject(source, base[name]);\n    },\n\n    // register 'prototype' to custom element 'name', store constructor \n    registerPrototype: function(name, extendee) { \n      var info = {\n        prototype: this.prototype\n      }\n      // native element must be specified in extends\n      var typeExtension = this.findTypeExtension(extendee);\n      if (typeExtension) {\n        info.extends = typeExtension;\n      }\n      // register the prototype with HTMLElement for name lookup\n      HTMLElement.register(name, this.prototype);\n      // register the custom type\n      this.ctor = document.registerElement(name, info);\n    },\n\n    findTypeExtension: function(name) {\n      if (name && name.indexOf('-') < 0) {\n        return name;\n      } else {\n        var p = this.findBasePrototype(name);\n        if (p.element) {\n          return this.findTypeExtension(p.element.extends);\n        }\n      }\n    }\n\n  };\n\n  // memoize base prototypes\n  var memoizedBases = {};\n\n  // implementation of 'chainObject' depends on support for __proto__\n  if (Object.__proto__) {\n    prototype.chainObject = function(object, inherited) {\n      if (object && inherited && object !== inherited) {\n        object.__proto__ = inherited;\n      }\n      return object;\n    }\n  } else {\n    prototype.chainObject = function(object, inherited) {\n      if (object && inherited && object !== inherited) {\n        var chained = Object.create(inherited);\n        object = extend(chained, object);\n      }\n      return object;\n    }\n  }\n\n  // On platforms that do not support __proto__ (versions of IE), the prototype\n  // chain of a custom element is simulated via installation of __proto__.\n  // Although custom elements manages this, we install it here so it's\n  // available during desugaring.\n  function ensurePrototypeTraversal(prototype) {\n    if (!Object.__proto__) {\n      var ancestor = Object.getPrototypeOf(prototype);\n      prototype.__proto__ = ancestor;\n      if (isBase(ancestor)) {\n        ancestor.__proto__ = Object.getPrototypeOf(ancestor);\n      }\n    }\n  }\n\n  // exports\n\n  api.declaration.prototype = prototype;\n\n})(Polymer);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope) {\n\n  var queue = {\n    // tell the queue to wait for an element to be ready\n    wait: function(element, check, go) {\n      if (this.indexOf(element) === -1) {\n        this.add(element);\n        element.__check = check;\n        element.__go = go;\n      }\n      return (this.indexOf(element) !== 0);\n    },\n    add: function(element) {\n      //console.log('queueing', element.name);\n      queueForElement(element).push(element);\n    },\n    indexOf: function(element) {\n      var i = queueForElement(element).indexOf(element);\n      if (i >= 0 && document.contains(element)) {\n        i += (HTMLImports.useNative || HTMLImports.ready) ? \n          importQueue.length : 1e9;\n      }\n      return i;  \n    },\n    // tell the queue an element is ready to be registered\n    go: function(element) {\n      var readied = this.remove(element);\n      if (readied) {\n        readied.__go.call(readied);\n        readied.__check = readied.__go = null;\n        this.check();\n      }\n    },\n    remove: function(element) {\n      var i = this.indexOf(element);\n      if (i !== 0) {\n        //console.warn('queue order wrong', i);\n        return;\n      }\n      return queueForElement(element).shift();\n    },\n    check: function() {\n      // next\n      var element = this.nextElement();\n      if (element) {\n        element.__check.call(element);\n      }\n      if (this.canReady()) {\n        this.ready();\n        return true;\n      }\n    },\n    nextElement: function() {\n      return nextQueued();\n    },\n    canReady: function() {\n      return !this.waitToReady && this.isEmpty();\n    },\n    isEmpty: function() {\n      return !importQueue.length && !mainQueue.length;\n    },\n    ready: function() {\n      // TODO(sorvell): As an optimization, turn off CE polyfill upgrading\n      // while registering. This way we avoid having to upgrade each document\n      // piecemeal per registration and can instead register all elements\n      // and upgrade once in a batch. Without this optimization, upgrade time\n      // degrades significantly when SD polyfill is used. This is mainly because\n      // querying the document tree for elements is slow under the SD polyfill.\n      if (CustomElements.ready === false) {\n        CustomElements.upgradeDocumentTree(document);\n        CustomElements.ready = true;\n      }\n      if (readyCallbacks) {\n        var fn;\n        while (readyCallbacks.length) {\n          fn = readyCallbacks.shift();\n          fn();\n        }\n      }\n    },\n    addReadyCallback: function(callback) {\n      if (callback) {\n        readyCallbacks.push(callback);\n      }\n    },\n    waitToReady: true\n  };\n\n  var importQueue = [];\n  var mainQueue = [];\n  var readyCallbacks = [];\n\n  function queueForElement(element) {\n    return document.contains(element) ? mainQueue : importQueue;\n  }\n\n  function nextQueued() {\n    return importQueue.length ? importQueue[0] : mainQueue[0];\n  }\n\n  var polymerReadied = false; \n\n  document.addEventListener('WebComponentsReady', function() {\n    CustomElements.ready = false;\n  });\n  \n  function whenPolymerReady(callback) {\n    queue.waitToReady = true;\n    CustomElements.ready = false;\n    HTMLImports.whenImportsReady(function() {\n      queue.addReadyCallback(callback);\n      queue.waitToReady = false;\n      queue.check();\n    });\n  }\n\n  // exports\n  scope.queue = queue;\n  scope.whenPolymerReady = whenPolymerReady;\n})(Polymer);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope) {\n\n  var whenPolymerReady = scope.whenPolymerReady;\n\n  function importElements(elementOrFragment, callback) {\n    if (elementOrFragment) {\n      document.head.appendChild(elementOrFragment);\n      whenPolymerReady(callback);\n    } else if (callback) {\n      callback();\n    }\n  }\n\n  function importUrls(urls, callback) {\n    if (urls && urls.length) {\n        var frag = document.createDocumentFragment();\n        for (var i=0, l=urls.length, url, link; (i<l) && (url=urls[i]); i++) {\n          link = document.createElement('link');\n          link.rel = 'import';\n          link.href = url;\n          frag.appendChild(link);\n        }\n        importElements(frag, callback);\n    } else if (callback) {\n      callback();\n    }\n  }\n\n  // exports\n  scope.import = importUrls;\n  scope.importElements = importElements;\n\n})(Polymer);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope) {\n\n  // imports\n\n  var extend = scope.extend;\n  var api = scope.api;\n  var queue = scope.queue;\n  var whenPolymerReady = scope.whenPolymerReady;\n  var getRegisteredPrototype = scope.getRegisteredPrototype;\n  var waitingForPrototype = scope.waitingForPrototype;\n\n  // declarative implementation: <polymer-element>\n\n  var prototype = extend(Object.create(HTMLElement.prototype), {\n\n    createdCallback: function() {\n      if (this.getAttribute('name')) {\n        this.init();\n      }\n    },\n\n    init: function() {\n      // fetch declared values\n      this.name = this.getAttribute('name');\n      this.extends = this.getAttribute('extends');\n      // initiate any async resource fetches\n      this.loadResources();\n      // register when all constraints are met\n      this.registerWhenReady();\n    },\n\n    registerWhenReady: function() {\n     if (this.registered\n       || this.waitingForPrototype(this.name)\n       || this.waitingForQueue()\n       || this.waitingForResources()) {\n          return;\n      }\n      // TODO(sorvell): ends up calling '_register' by virtue\n      // of `waitingForQueue` (see below)\n      queue.go(this);\n    },\n\n    // TODO(sorvell): refactor, this method is private-ish, but it's being\n    // called by the queue object.\n    _register: function() {\n      //console.log('registering', this.name);\n      //console.group('registering', this.name);\n      // warn if extending from a custom element not registered via Polymer\n      if (isCustomTag(this.extends) && !isRegistered(this.extends)) {\n        console.warn('%s is attempting to extend %s, an unregistered element ' +\n            'or one that was not registered with Polymer.', this.name,\n            this.extends);\n      }\n      this.register(this.name, this.extends);\n      this.registered = true;\n      //console.groupEnd();\n    },\n\n    waitingForPrototype: function(name) {\n      if (!getRegisteredPrototype(name)) {\n        // then wait for a prototype\n        waitingForPrototype(name, this);\n        // emulate script if user is not supplying one\n        this.handleNoScript(name);\n        // prototype not ready yet\n        return true;\n      }\n    },\n\n    handleNoScript: function(name) {\n      // if explicitly marked as 'noscript'\n      if (this.hasAttribute('noscript') && !this.noscript) {\n        this.noscript = true;\n        // TODO(sorvell): CustomElements polyfill awareness:\n        // noscript elements should upgrade in logical order\n        // script injection ensures this under native custom elements;\n        // under imports + ce polyfills, scripts run before upgrades.\n        // dependencies should be ready at upgrade time so register\n        // prototype at this time.\n        if (window.CustomElements && !CustomElements.useNative) {\n          Polymer(name);\n        } else {\n          var script = document.createElement('script');\n          script.textContent = 'Polymer(\\'' + name + '\\');';\n          this.appendChild(script);\n        }\n      }\n    },\n\n    waitingForResources: function() {\n      return this._needsResources;\n    },\n\n    // NOTE: Elements must be queued in proper order for inheritance/composition\n    // dependency resolution. Previously this was enforced for inheritance,\n    // and by rule for composition. It's now entirely by rule.\n    waitingForQueue: function() {\n      return queue.wait(this, this.registerWhenReady, this._register);\n    },\n\n    loadResources: function() {\n      this._needsResources = true;\n      this.loadStyles(function() {\n        this._needsResources = false;\n        this.registerWhenReady();\n      }.bind(this));\n    }\n\n  });\n\n  // semi-pluggable APIs \n\n  // TODO(sjmiles): should be fully pluggable (aka decoupled, currently\n  // the various plugins are allowed to depend on each other directly)\n  api.publish(api.declaration, prototype);\n\n  // utility and bookkeeping\n\n  function isRegistered(name) {\n    return Boolean(HTMLElement.getPrototypeForTag(name));\n  }\n\n  function isCustomTag(name) {\n    return (name && name.indexOf('-') >= 0);\n  }\n\n  // boot tasks\n\n  whenPolymerReady(function() {\n    document.body.removeAttribute('unresolved');\n    document.dispatchEvent(\n      new CustomEvent('polymer-ready', {bubbles: true})\n    );\n  });\n\n  // register polymer-element with document\n\n  document.registerElement('polymer-element', {prototype: prototype});\n\n})(Polymer);\n"]}
\ No newline at end of file
diff --git a/examples/pipetobrowser/browser/libs/vendor/traceur/traceur.js b/examples/pipetobrowser/browser/libs/vendor/traceur/traceur.js
new file mode 100644
index 0000000..6542e3a
--- /dev/null
+++ b/examples/pipetobrowser/browser/libs/vendor/traceur/traceur.js
@@ -0,0 +1,21801 @@
+(function(global) {
+  'use strict';
+  if (global.$traceurRuntime) {
+    return;
+  }
+  var $Object = Object;
+  var $TypeError = TypeError;
+  var $create = $Object.create;
+  var $defineProperties = $Object.defineProperties;
+  var $defineProperty = $Object.defineProperty;
+  var $freeze = $Object.freeze;
+  var $getOwnPropertyDescriptor = $Object.getOwnPropertyDescriptor;
+  var $getOwnPropertyNames = $Object.getOwnPropertyNames;
+  var $getPrototypeOf = $Object.getPrototypeOf;
+  var $hasOwnProperty = $Object.prototype.hasOwnProperty;
+  var $toString = $Object.prototype.toString;
+  function nonEnum(value) {
+    return {
+      configurable: true,
+      enumerable: false,
+      value: value,
+      writable: true
+    };
+  }
+  var types = {
+    void: function voidType() {},
+    any: function any() {},
+    string: function string() {},
+    number: function number() {},
+    boolean: function boolean() {}
+  };
+  var method = nonEnum;
+  var counter = 0;
+  function newUniqueString() {
+    return '__$' + Math.floor(Math.random() * 1e9) + '$' + ++counter + '$__';
+  }
+  var symbolInternalProperty = newUniqueString();
+  var symbolDescriptionProperty = newUniqueString();
+  var symbolDataProperty = newUniqueString();
+  var symbolValues = $create(null);
+  function isSymbol(symbol) {
+    return typeof symbol === 'object' && symbol instanceof SymbolValue;
+  }
+  function typeOf(v) {
+    if (isSymbol(v))
+      return 'symbol';
+    return typeof v;
+  }
+  function Symbol(description) {
+    var value = new SymbolValue(description);
+    if (!(this instanceof Symbol))
+      return value;
+    throw new TypeError('Symbol cannot be new\'ed');
+  }
+  $defineProperty(Symbol.prototype, 'constructor', nonEnum(Symbol));
+  $defineProperty(Symbol.prototype, 'toString', method(function() {
+    var symbolValue = this[symbolDataProperty];
+    if (!getOption('symbols'))
+      return symbolValue[symbolInternalProperty];
+    if (!symbolValue)
+      throw TypeError('Conversion from symbol to string');
+    var desc = symbolValue[symbolDescriptionProperty];
+    if (desc === undefined)
+      desc = '';
+    return 'Symbol(' + desc + ')';
+  }));
+  $defineProperty(Symbol.prototype, 'valueOf', method(function() {
+    var symbolValue = this[symbolDataProperty];
+    if (!symbolValue)
+      throw TypeError('Conversion from symbol to string');
+    if (!getOption('symbols'))
+      return symbolValue[symbolInternalProperty];
+    return symbolValue;
+  }));
+  function SymbolValue(description) {
+    var key = newUniqueString();
+    $defineProperty(this, symbolDataProperty, {value: this});
+    $defineProperty(this, symbolInternalProperty, {value: key});
+    $defineProperty(this, symbolDescriptionProperty, {value: description});
+    $freeze(this);
+    symbolValues[key] = this;
+  }
+  $defineProperty(SymbolValue.prototype, 'constructor', nonEnum(Symbol));
+  $defineProperty(SymbolValue.prototype, 'toString', {
+    value: Symbol.prototype.toString,
+    enumerable: false
+  });
+  $defineProperty(SymbolValue.prototype, 'valueOf', {
+    value: Symbol.prototype.valueOf,
+    enumerable: false
+  });
+  $freeze(SymbolValue.prototype);
+  Symbol.iterator = Symbol();
+  function toProperty(name) {
+    if (isSymbol(name))
+      return name[symbolInternalProperty];
+    return name;
+  }
+  function getOwnPropertyNames(object) {
+    var rv = [];
+    var names = $getOwnPropertyNames(object);
+    for (var i = 0; i < names.length; i++) {
+      var name = names[i];
+      if (!symbolValues[name])
+        rv.push(name);
+    }
+    return rv;
+  }
+  function getOwnPropertyDescriptor(object, name) {
+    return $getOwnPropertyDescriptor(object, toProperty(name));
+  }
+  function getOwnPropertySymbols(object) {
+    var rv = [];
+    var names = $getOwnPropertyNames(object);
+    for (var i = 0; i < names.length; i++) {
+      var symbol = symbolValues[names[i]];
+      if (symbol)
+        rv.push(symbol);
+    }
+    return rv;
+  }
+  function hasOwnProperty(name) {
+    return $hasOwnProperty.call(this, toProperty(name));
+  }
+  function getOption(name) {
+    return global.traceur && global.traceur.options[name];
+  }
+  function setProperty(object, name, value) {
+    var sym,
+        desc;
+    if (isSymbol(name)) {
+      sym = name;
+      name = name[symbolInternalProperty];
+    }
+    object[name] = value;
+    if (sym && (desc = $getOwnPropertyDescriptor(object, name)))
+      $defineProperty(object, name, {enumerable: false});
+    return value;
+  }
+  function defineProperty(object, name, descriptor) {
+    if (isSymbol(name)) {
+      if (descriptor.enumerable) {
+        descriptor = $create(descriptor, {enumerable: {value: false}});
+      }
+      name = name[symbolInternalProperty];
+    }
+    $defineProperty(object, name, descriptor);
+    return object;
+  }
+  function polyfillObject(Object) {
+    $defineProperty(Object, 'defineProperty', {value: defineProperty});
+    $defineProperty(Object, 'getOwnPropertyNames', {value: getOwnPropertyNames});
+    $defineProperty(Object, 'getOwnPropertyDescriptor', {value: getOwnPropertyDescriptor});
+    $defineProperty(Object.prototype, 'hasOwnProperty', {value: hasOwnProperty});
+    Object.getOwnPropertySymbols = getOwnPropertySymbols;
+    function is(left, right) {
+      if (left === right)
+        return left !== 0 || 1 / left === 1 / right;
+      return left !== left && right !== right;
+    }
+    $defineProperty(Object, 'is', method(is));
+    function assign(target, source) {
+      var props = $getOwnPropertyNames(source);
+      var p,
+          length = props.length;
+      for (p = 0; p < length; p++) {
+        target[props[p]] = source[props[p]];
+      }
+      return target;
+    }
+    $defineProperty(Object, 'assign', method(assign));
+    function mixin(target, source) {
+      var props = $getOwnPropertyNames(source);
+      var p,
+          descriptor,
+          length = props.length;
+      for (p = 0; p < length; p++) {
+        descriptor = $getOwnPropertyDescriptor(source, props[p]);
+        $defineProperty(target, props[p], descriptor);
+      }
+      return target;
+    }
+    $defineProperty(Object, 'mixin', method(mixin));
+  }
+  function exportStar(object) {
+    for (var i = 1; i < arguments.length; i++) {
+      var names = $getOwnPropertyNames(arguments[i]);
+      for (var j = 0; j < names.length; j++) {
+        (function(mod, name) {
+          $defineProperty(object, name, {
+            get: function() {
+              return mod[name];
+            },
+            enumerable: true
+          });
+        })(arguments[i], names[j]);
+      }
+    }
+    return object;
+  }
+  function toObject(value) {
+    if (value == null)
+      throw $TypeError();
+    return $Object(value);
+  }
+  function spread() {
+    var rv = [],
+        k = 0;
+    for (var i = 0; i < arguments.length; i++) {
+      var valueToSpread = toObject(arguments[i]);
+      for (var j = 0; j < valueToSpread.length; j++) {
+        rv[k++] = valueToSpread[j];
+      }
+    }
+    return rv;
+  }
+  function getPropertyDescriptor(object, name) {
+    while (object !== null) {
+      var result = $getOwnPropertyDescriptor(object, name);
+      if (result)
+        return result;
+      object = $getPrototypeOf(object);
+    }
+    return undefined;
+  }
+  function superDescriptor(homeObject, name) {
+    var proto = $getPrototypeOf(homeObject);
+    if (!proto)
+      throw $TypeError('super is null');
+    return getPropertyDescriptor(proto, name);
+  }
+  function superCall(self, homeObject, name, args) {
+    var descriptor = superDescriptor(homeObject, name);
+    if (descriptor) {
+      if ('value' in descriptor)
+        return descriptor.value.apply(self, args);
+      if (descriptor.get)
+        return descriptor.get.call(self).apply(self, args);
+    }
+    throw $TypeError("super has no method '" + name + "'.");
+  }
+  function superGet(self, homeObject, name) {
+    var descriptor = superDescriptor(homeObject, name);
+    if (descriptor) {
+      if (descriptor.get)
+        return descriptor.get.call(self);
+      else if ('value' in descriptor)
+        return descriptor.value;
+    }
+    return undefined;
+  }
+  function superSet(self, homeObject, name, value) {
+    var descriptor = superDescriptor(homeObject, name);
+    if (descriptor && descriptor.set) {
+      descriptor.set.call(self, value);
+      return value;
+    }
+    throw $TypeError("super has no setter '" + name + "'.");
+  }
+  function getDescriptors(object) {
+    var descriptors = {},
+        name,
+        names = $getOwnPropertyNames(object);
+    for (var i = 0; i < names.length; i++) {
+      var name = names[i];
+      descriptors[name] = $getOwnPropertyDescriptor(object, name);
+    }
+    return descriptors;
+  }
+  function createClass(ctor, object, staticObject, superClass) {
+    $defineProperty(object, 'constructor', {
+      value: ctor,
+      configurable: true,
+      enumerable: false,
+      writable: true
+    });
+    if (arguments.length > 3) {
+      if (typeof superClass === 'function')
+        ctor.__proto__ = superClass;
+      ctor.prototype = $create(getProtoParent(superClass), getDescriptors(object));
+    } else {
+      ctor.prototype = object;
+    }
+    $defineProperty(ctor, 'prototype', {
+      configurable: false,
+      writable: false
+    });
+    return $defineProperties(ctor, getDescriptors(staticObject));
+  }
+  function getProtoParent(superClass) {
+    if (typeof superClass === 'function') {
+      var prototype = superClass.prototype;
+      if ($Object(prototype) === prototype || prototype === null)
+        return superClass.prototype;
+    }
+    if (superClass === null)
+      return null;
+    throw new TypeError();
+  }
+  function defaultSuperCall(self, homeObject, args) {
+    if ($getPrototypeOf(homeObject) !== null)
+      superCall(self, homeObject, 'constructor', args);
+  }
+  var ST_NEWBORN = 0;
+  var ST_EXECUTING = 1;
+  var ST_SUSPENDED = 2;
+  var ST_CLOSED = 3;
+  var END_STATE = -2;
+  var RETHROW_STATE = -3;
+  function addIterator(object) {
+    return defineProperty(object, Symbol.iterator, nonEnum(function() {
+      return this;
+    }));
+  }
+  function getInternalError(state) {
+    return new Error('Traceur compiler bug: invalid state in state machine: ' + state);
+  }
+  function GeneratorContext() {
+    this.state = 0;
+    this.GState = ST_NEWBORN;
+    this.storedException = undefined;
+    this.finallyFallThrough = undefined;
+    this.sent_ = undefined;
+    this.returnValue = undefined;
+    this.tryStack_ = [];
+  }
+  GeneratorContext.prototype = {
+    pushTry: function(catchState, finallyState) {
+      if (finallyState !== null) {
+        var finallyFallThrough = null;
+        for (var i = this.tryStack_.length - 1; i >= 0; i--) {
+          if (this.tryStack_[i].catch !== undefined) {
+            finallyFallThrough = this.tryStack_[i].catch;
+            break;
+          }
+        }
+        if (finallyFallThrough === null)
+          finallyFallThrough = RETHROW_STATE;
+        this.tryStack_.push({
+          finally: finallyState,
+          finallyFallThrough: finallyFallThrough
+        });
+      }
+      if (catchState !== null) {
+        this.tryStack_.push({catch: catchState});
+      }
+    },
+    popTry: function() {
+      this.tryStack_.pop();
+    },
+    get sent() {
+      this.maybeThrow();
+      return this.sent_;
+    },
+    set sent(v) {
+      this.sent_ = v;
+    },
+    get sentIgnoreThrow() {
+      return this.sent_;
+    },
+    maybeThrow: function() {
+      if (this.action === 'throw') {
+        this.action = 'next';
+        throw this.sent_;
+      }
+    },
+    end: function() {
+      switch (this.state) {
+        case END_STATE:
+          return this;
+        case RETHROW_STATE:
+          throw this.storedException;
+        default:
+          throw getInternalError(this.state);
+      }
+    }
+  };
+  function getNextOrThrow(ctx, moveNext, action) {
+    return function(x) {
+      switch (ctx.GState) {
+        case ST_EXECUTING:
+          throw new Error(("\"" + action + "\" on executing generator"));
+        case ST_CLOSED:
+          throw new Error(("\"" + action + "\" on closed generator"));
+        case ST_NEWBORN:
+          if (action === 'throw') {
+            ctx.GState = ST_CLOSED;
+            throw x;
+          }
+          if (x !== undefined)
+            throw $TypeError('Sent value to newborn generator');
+        case ST_SUSPENDED:
+          ctx.GState = ST_EXECUTING;
+          ctx.action = action;
+          ctx.sent = x;
+          var value = moveNext(ctx);
+          var done = value === ctx;
+          if (done)
+            value = ctx.returnValue;
+          ctx.GState = done ? ST_CLOSED : ST_SUSPENDED;
+          return {
+            value: value,
+            done: done
+          };
+      }
+    };
+  }
+  function generatorWrap(innerFunction, self) {
+    var moveNext = getMoveNext(innerFunction, self);
+    var ctx = new GeneratorContext();
+    return addIterator({
+      next: getNextOrThrow(ctx, moveNext, 'next'),
+      throw: getNextOrThrow(ctx, moveNext, 'throw')
+    });
+  }
+  function AsyncFunctionContext() {
+    GeneratorContext.call(this);
+    this.err = undefined;
+    var ctx = this;
+    ctx.result = new Promise(function(resolve, reject) {
+      ctx.resolve = resolve;
+      ctx.reject = reject;
+    });
+  }
+  AsyncFunctionContext.prototype = Object.create(GeneratorContext.prototype);
+  AsyncFunctionContext.prototype.end = function() {
+    switch (this.state) {
+      case END_STATE:
+        return;
+      case RETHROW_STATE:
+        this.reject(this.storedException);
+      default:
+        this.reject(getInternalError(this.state));
+    }
+  };
+  function asyncWrap(innerFunction, self) {
+    var moveNext = getMoveNext(innerFunction, self);
+    var ctx = new AsyncFunctionContext();
+    ctx.createCallback = function(newState) {
+      return function(value) {
+        ctx.state = newState;
+        ctx.value = value;
+        moveNext(ctx);
+      };
+    };
+    ctx.createErrback = function(newState) {
+      return function(err) {
+        ctx.state = newState;
+        ctx.err = err;
+        moveNext(ctx);
+      };
+    };
+    moveNext(ctx);
+    return ctx.result;
+  }
+  function getMoveNext(innerFunction, self) {
+    return function(ctx) {
+      while (true) {
+        try {
+          return innerFunction.call(self, ctx);
+        } catch (ex) {
+          ctx.storedException = ex;
+          var last = ctx.tryStack_[ctx.tryStack_.length - 1];
+          if (!last) {
+            ctx.GState = ST_CLOSED;
+            ctx.state = END_STATE;
+            throw ex;
+          }
+          ctx.state = last.catch !== undefined ? last.catch : last.finally;
+          if (last.finallyFallThrough !== undefined)
+            ctx.finallyFallThrough = last.finallyFallThrough;
+        }
+      }
+    };
+  }
+  function setupGlobals(global) {
+    global.Symbol = Symbol;
+    polyfillObject(global.Object);
+  }
+  setupGlobals(global);
+  global.$traceurRuntime = {
+    asyncWrap: asyncWrap,
+    createClass: createClass,
+    defaultSuperCall: defaultSuperCall,
+    exportStar: exportStar,
+    generatorWrap: generatorWrap,
+    setProperty: setProperty,
+    setupGlobals: setupGlobals,
+    spread: spread,
+    superCall: superCall,
+    superGet: superGet,
+    superSet: superSet,
+    toObject: toObject,
+    toProperty: toProperty,
+    type: types,
+    typeof: typeOf
+  };
+})(typeof global !== 'undefined' ? global : this);
+(function() {
+  function buildFromEncodedParts(opt_scheme, opt_userInfo, opt_domain, opt_port, opt_path, opt_queryData, opt_fragment) {
+    var out = [];
+    if (opt_scheme) {
+      out.push(opt_scheme, ':');
+    }
+    if (opt_domain) {
+      out.push('//');
+      if (opt_userInfo) {
+        out.push(opt_userInfo, '@');
+      }
+      out.push(opt_domain);
+      if (opt_port) {
+        out.push(':', opt_port);
+      }
+    }
+    if (opt_path) {
+      out.push(opt_path);
+    }
+    if (opt_queryData) {
+      out.push('?', opt_queryData);
+    }
+    if (opt_fragment) {
+      out.push('#', opt_fragment);
+    }
+    return out.join('');
+  }
+  ;
+  var splitRe = new RegExp('^' + '(?:' + '([^:/?#.]+)' + ':)?' + '(?://' + '(?:([^/?#]*)@)?' + '([\\w\\d\\-\\u0100-\\uffff.%]*)' + '(?::([0-9]+))?' + ')?' + '([^?#]+)?' + '(?:\\?([^#]*))?' + '(?:#(.*))?' + '$');
+  var ComponentIndex = {
+    SCHEME: 1,
+    USER_INFO: 2,
+    DOMAIN: 3,
+    PORT: 4,
+    PATH: 5,
+    QUERY_DATA: 6,
+    FRAGMENT: 7
+  };
+  function split(uri) {
+    return (uri.match(splitRe));
+  }
+  function removeDotSegments(path) {
+    if (path === '/')
+      return '/';
+    var leadingSlash = path[0] === '/' ? '/' : '';
+    var trailingSlash = path.slice(-1) === '/' ? '/' : '';
+    var segments = path.split('/');
+    var out = [];
+    var up = 0;
+    for (var pos = 0; pos < segments.length; pos++) {
+      var segment = segments[pos];
+      switch (segment) {
+        case '':
+        case '.':
+          break;
+        case '..':
+          if (out.length)
+            out.pop();
+          else
+            up++;
+          break;
+        default:
+          out.push(segment);
+      }
+    }
+    if (!leadingSlash) {
+      while (up-- > 0) {
+        out.unshift('..');
+      }
+      if (out.length === 0)
+        out.push('.');
+    }
+    return leadingSlash + out.join('/') + trailingSlash;
+  }
+  function joinAndCanonicalizePath(parts) {
+    var path = parts[ComponentIndex.PATH] || '';
+    path = removeDotSegments(path);
+    parts[ComponentIndex.PATH] = path;
+    return buildFromEncodedParts(parts[ComponentIndex.SCHEME], parts[ComponentIndex.USER_INFO], parts[ComponentIndex.DOMAIN], parts[ComponentIndex.PORT], parts[ComponentIndex.PATH], parts[ComponentIndex.QUERY_DATA], parts[ComponentIndex.FRAGMENT]);
+  }
+  function canonicalizeUrl(url) {
+    var parts = split(url);
+    return joinAndCanonicalizePath(parts);
+  }
+  function resolveUrl(base, url) {
+    var parts = split(url);
+    var baseParts = split(base);
+    if (parts[ComponentIndex.SCHEME]) {
+      return joinAndCanonicalizePath(parts);
+    } else {
+      parts[ComponentIndex.SCHEME] = baseParts[ComponentIndex.SCHEME];
+    }
+    for (var i = ComponentIndex.SCHEME; i <= ComponentIndex.PORT; i++) {
+      if (!parts[i]) {
+        parts[i] = baseParts[i];
+      }
+    }
+    if (parts[ComponentIndex.PATH][0] == '/') {
+      return joinAndCanonicalizePath(parts);
+    }
+    var path = baseParts[ComponentIndex.PATH];
+    var index = path.lastIndexOf('/');
+    path = path.slice(0, index + 1) + parts[ComponentIndex.PATH];
+    parts[ComponentIndex.PATH] = path;
+    return joinAndCanonicalizePath(parts);
+  }
+  function isAbsolute(name) {
+    if (!name)
+      return false;
+    if (name[0] === '/')
+      return true;
+    var parts = split(name);
+    if (parts[ComponentIndex.SCHEME])
+      return true;
+    return false;
+  }
+  $traceurRuntime.canonicalizeUrl = canonicalizeUrl;
+  $traceurRuntime.isAbsolute = isAbsolute;
+  $traceurRuntime.removeDotSegments = removeDotSegments;
+  $traceurRuntime.resolveUrl = resolveUrl;
+})();
+(function(global) {
+  'use strict';
+  var $__2 = $traceurRuntime,
+      canonicalizeUrl = $__2.canonicalizeUrl,
+      resolveUrl = $__2.resolveUrl,
+      isAbsolute = $__2.isAbsolute;
+  var moduleInstantiators = Object.create(null);
+  var baseURL;
+  if (global.location && global.location.href)
+    baseURL = resolveUrl(global.location.href, './');
+  else
+    baseURL = '';
+  var UncoatedModuleEntry = function UncoatedModuleEntry(url, uncoatedModule) {
+    this.url = url;
+    this.value_ = uncoatedModule;
+  };
+  ($traceurRuntime.createClass)(UncoatedModuleEntry, {}, {});
+  var UncoatedModuleInstantiator = function UncoatedModuleInstantiator(url, func) {
+    $traceurRuntime.superCall(this, $UncoatedModuleInstantiator.prototype, "constructor", [url, null]);
+    this.func = func;
+  };
+  var $UncoatedModuleInstantiator = UncoatedModuleInstantiator;
+  ($traceurRuntime.createClass)(UncoatedModuleInstantiator, {getUncoatedModule: function() {
+      if (this.value_)
+        return this.value_;
+      return this.value_ = this.func.call(global);
+    }}, {}, UncoatedModuleEntry);
+  function getUncoatedModuleInstantiator(name) {
+    if (!name)
+      return;
+    var url = ModuleStore.normalize(name);
+    return moduleInstantiators[url];
+  }
+  ;
+  var moduleInstances = Object.create(null);
+  var liveModuleSentinel = {};
+  function Module(uncoatedModule) {
+    var isLive = arguments[1];
+    var coatedModule = Object.create(null);
+    Object.getOwnPropertyNames(uncoatedModule).forEach((function(name) {
+      var getter,
+          value;
+      if (isLive === liveModuleSentinel) {
+        var descr = Object.getOwnPropertyDescriptor(uncoatedModule, name);
+        if (descr.get)
+          getter = descr.get;
+      }
+      if (!getter) {
+        value = uncoatedModule[name];
+        getter = function() {
+          return value;
+        };
+      }
+      Object.defineProperty(coatedModule, name, {
+        get: getter,
+        enumerable: true
+      });
+    }));
+    Object.preventExtensions(coatedModule);
+    return coatedModule;
+  }
+  var ModuleStore = {
+    normalize: function(name, refererName, refererAddress) {
+      if (typeof name !== "string")
+        throw new TypeError("module name must be a string, not " + typeof name);
+      if (isAbsolute(name))
+        return canonicalizeUrl(name);
+      if (/[^\.]\/\.\.\//.test(name)) {
+        throw new Error('module name embeds /../: ' + name);
+      }
+      if (name[0] === '.' && refererName)
+        return resolveUrl(refererName, name);
+      return canonicalizeUrl(name);
+    },
+    get: function(normalizedName) {
+      var m = getUncoatedModuleInstantiator(normalizedName);
+      if (!m)
+        return undefined;
+      var moduleInstance = moduleInstances[m.url];
+      if (moduleInstance)
+        return moduleInstance;
+      moduleInstance = Module(m.getUncoatedModule(), liveModuleSentinel);
+      return moduleInstances[m.url] = moduleInstance;
+    },
+    set: function(normalizedName, module) {
+      normalizedName = String(normalizedName);
+      moduleInstantiators[normalizedName] = new UncoatedModuleInstantiator(normalizedName, (function() {
+        return module;
+      }));
+      moduleInstances[normalizedName] = module;
+    },
+    get baseURL() {
+      return baseURL;
+    },
+    set baseURL(v) {
+      baseURL = String(v);
+    },
+    registerModule: function(name, func) {
+      var normalizedName = ModuleStore.normalize(name);
+      if (moduleInstantiators[normalizedName])
+        throw new Error('duplicate module named ' + normalizedName);
+      moduleInstantiators[normalizedName] = new UncoatedModuleInstantiator(normalizedName, func);
+    },
+    bundleStore: Object.create(null),
+    register: function(name, deps, func) {
+      if (!deps || !deps.length) {
+        this.registerModule(name, func);
+      } else {
+        this.bundleStore[name] = {
+          deps: deps,
+          execute: func
+        };
+      }
+    },
+    getAnonymousModule: function(func) {
+      return new Module(func.call(global), liveModuleSentinel);
+    },
+    getForTesting: function(name) {
+      var $__0 = this;
+      if (!this.testingPrefix_) {
+        Object.keys(moduleInstances).some((function(key) {
+          var m = /(traceur@[^\/]*\/)/.exec(key);
+          if (m) {
+            $__0.testingPrefix_ = m[1];
+            return true;
+          }
+        }));
+      }
+      return this.get(this.testingPrefix_ + name);
+    }
+  };
+  ModuleStore.set('@traceur/src/runtime/ModuleStore', new Module({ModuleStore: ModuleStore}));
+  var setupGlobals = $traceurRuntime.setupGlobals;
+  $traceurRuntime.setupGlobals = function(global) {
+    setupGlobals(global);
+  };
+  $traceurRuntime.ModuleStore = ModuleStore;
+  global.System = {
+    register: ModuleStore.register.bind(ModuleStore),
+    get: ModuleStore.get,
+    set: ModuleStore.set,
+    normalize: ModuleStore.normalize
+  };
+  $traceurRuntime.getModuleImpl = function(name) {
+    var instantiator = getUncoatedModuleInstantiator(name);
+    return instantiator && instantiator.getUncoatedModule();
+  };
+})(typeof global !== 'undefined' ? global : this);
+System.register("traceur@0.0.32/src/runtime/polyfills/utils", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/runtime/polyfills/utils";
+  var toObject = $traceurRuntime.toObject;
+  function toUint32(x) {
+    return x | 0;
+  }
+  return {
+    get toObject() {
+      return toObject;
+    },
+    get toUint32() {
+      return toUint32;
+    }
+  };
+});
+System.register("traceur@0.0.32/src/runtime/polyfills/ArrayIterator", [], function() {
+  "use strict";
+  var $__4;
+  var __moduleName = "traceur@0.0.32/src/runtime/polyfills/ArrayIterator";
+  var $__5 = System.get("traceur@0.0.32/src/runtime/polyfills/utils"),
+      toObject = $__5.toObject,
+      toUint32 = $__5.toUint32;
+  var ARRAY_ITERATOR_KIND_KEYS = 1;
+  var ARRAY_ITERATOR_KIND_VALUES = 2;
+  var ARRAY_ITERATOR_KIND_ENTRIES = 3;
+  var ArrayIterator = function ArrayIterator() {};
+  ($traceurRuntime.createClass)(ArrayIterator, ($__4 = {}, Object.defineProperty($__4, "next", {
+    value: function() {
+      var iterator = toObject(this);
+      var array = iterator.iteratorObject_;
+      if (!array) {
+        throw new TypeError('Object is not an ArrayIterator');
+      }
+      var index = iterator.arrayIteratorNextIndex_;
+      var itemKind = iterator.arrayIterationKind_;
+      var length = toUint32(array.length);
+      if (index >= length) {
+        iterator.arrayIteratorNextIndex_ = Infinity;
+        return createIteratorResultObject(undefined, true);
+      }
+      iterator.arrayIteratorNextIndex_ = index + 1;
+      if (itemKind == ARRAY_ITERATOR_KIND_VALUES)
+        return createIteratorResultObject(array[index], false);
+      if (itemKind == ARRAY_ITERATOR_KIND_ENTRIES)
+        return createIteratorResultObject([index, array[index]], false);
+      return createIteratorResultObject(index, false);
+    },
+    configurable: true,
+    enumerable: true,
+    writable: true
+  }), Object.defineProperty($__4, Symbol.iterator, {
+    value: function() {
+      return this;
+    },
+    configurable: true,
+    enumerable: true,
+    writable: true
+  }), $__4), {});
+  function createArrayIterator(array, kind) {
+    var object = toObject(array);
+    var iterator = new ArrayIterator;
+    iterator.iteratorObject_ = object;
+    iterator.arrayIteratorNextIndex_ = 0;
+    iterator.arrayIterationKind_ = kind;
+    return iterator;
+  }
+  function createIteratorResultObject(value, done) {
+    return {
+      value: value,
+      done: done
+    };
+  }
+  function entries() {
+    return createArrayIterator(this, ARRAY_ITERATOR_KIND_ENTRIES);
+  }
+  function keys() {
+    return createArrayIterator(this, ARRAY_ITERATOR_KIND_KEYS);
+  }
+  function values() {
+    return createArrayIterator(this, ARRAY_ITERATOR_KIND_VALUES);
+  }
+  return {
+    get entries() {
+      return entries;
+    },
+    get keys() {
+      return keys;
+    },
+    get values() {
+      return values;
+    }
+  };
+});
+System.register("traceur@0.0.32/node_modules/rsvp/lib/rsvp/asap", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/node_modules/rsvp/lib/rsvp/asap";
+  var $__default = function asap(callback, arg) {
+    var length = queue.push([callback, arg]);
+    if (length === 1) {
+      scheduleFlush();
+    }
+  };
+  var browserGlobal = (typeof window !== 'undefined') ? window : {};
+  var BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver;
+  function useNextTick() {
+    return function() {
+      process.nextTick(flush);
+    };
+  }
+  function useMutationObserver() {
+    var iterations = 0;
+    var observer = new BrowserMutationObserver(flush);
+    var node = document.createTextNode('');
+    observer.observe(node, {characterData: true});
+    return function() {
+      node.data = (iterations = ++iterations % 2);
+    };
+  }
+  function useSetTimeout() {
+    return function() {
+      setTimeout(flush, 1);
+    };
+  }
+  var queue = [];
+  function flush() {
+    for (var i = 0; i < queue.length; i++) {
+      var tuple = queue[i];
+      var callback = tuple[0],
+          arg = tuple[1];
+      callback(arg);
+    }
+    queue = [];
+  }
+  var scheduleFlush;
+  if (typeof process !== 'undefined' && {}.toString.call(process) === '[object process]') {
+    scheduleFlush = useNextTick();
+  } else if (BrowserMutationObserver) {
+    scheduleFlush = useMutationObserver();
+  } else {
+    scheduleFlush = useSetTimeout();
+  }
+  return {get default() {
+      return $__default;
+    }};
+});
+System.register("traceur@0.0.32/src/runtime/polyfills/Promise", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/runtime/polyfills/Promise";
+  var async = System.get("traceur@0.0.32/node_modules/rsvp/lib/rsvp/asap").default;
+  function isPromise(x) {
+    return x && typeof x === 'object' && x.status_ !== undefined;
+  }
+  function chain(promise) {
+    var onResolve = arguments[1] !== (void 0) ? arguments[1] : (function(x) {
+      return x;
+    });
+    var onReject = arguments[2] !== (void 0) ? arguments[2] : (function(e) {
+      throw e;
+    });
+    var deferred = getDeferred(promise.constructor);
+    switch (promise.status_) {
+      case undefined:
+        throw TypeError;
+      case 'pending':
+        promise.onResolve_.push([deferred, onResolve]);
+        promise.onReject_.push([deferred, onReject]);
+        break;
+      case 'resolved':
+        promiseReact(deferred, onResolve, promise.value_);
+        break;
+      case 'rejected':
+        promiseReact(deferred, onReject, promise.value_);
+        break;
+    }
+    return deferred.promise;
+  }
+  function getDeferred(C) {
+    var result = {};
+    result.promise = new C((function(resolve, reject) {
+      result.resolve = resolve;
+      result.reject = reject;
+    }));
+    return result;
+  }
+  var Promise = function Promise(resolver) {
+    var $__6 = this;
+    this.status_ = 'pending';
+    this.onResolve_ = [];
+    this.onReject_ = [];
+    resolver((function(x) {
+      promiseResolve($__6, x);
+    }), (function(r) {
+      promiseReject($__6, r);
+    }));
+  };
+  ($traceurRuntime.createClass)(Promise, {
+    catch: function(onReject) {
+      return this.then(undefined, onReject);
+    },
+    then: function() {
+      var onResolve = arguments[0] !== (void 0) ? arguments[0] : (function(x) {
+        return x;
+      });
+      var onReject = arguments[1];
+      var $__6 = this;
+      var constructor = this.constructor;
+      return chain(this, (function(x) {
+        x = promiseCoerce(constructor, x);
+        return x === $__6 ? onReject(new TypeError) : isPromise(x) ? x.then(onResolve, onReject) : onResolve(x);
+      }), onReject);
+    }
+  }, {
+    resolve: function(x) {
+      return new this((function(resolve, reject) {
+        resolve(x);
+      }));
+    },
+    reject: function(r) {
+      return new this((function(resolve, reject) {
+        reject(r);
+      }));
+    },
+    cast: function(x) {
+      if (x instanceof this)
+        return x;
+      if (isPromise(x)) {
+        var result = getDeferred(this);
+        chain(x, result.resolve, result.reject);
+        return result.promise;
+      }
+      return this.resolve(x);
+    },
+    all: function(values) {
+      var deferred = getDeferred(this);
+      var count = 0;
+      var resolutions = [];
+      try {
+        for (var i = 0; i < values.length; i++) {
+          ++count;
+          this.cast(values[i]).then(function(i, x) {
+            resolutions[i] = x;
+            if (--count === 0)
+              deferred.resolve(resolutions);
+          }.bind(undefined, i), (function(r) {
+            if (count > 0)
+              count = 0;
+            deferred.reject(r);
+          }));
+        }
+        if (count === 0)
+          deferred.resolve(resolutions);
+      } catch (e) {
+        deferred.reject(e);
+      }
+      return deferred.promise;
+    },
+    race: function(values) {
+      var deferred = getDeferred(this);
+      try {
+        for (var i = 0; i < values.length; i++) {
+          this.cast(values[i]).then((function(x) {
+            deferred.resolve(x);
+          }), (function(r) {
+            deferred.reject(r);
+          }));
+        }
+      } catch (e) {
+        deferred.reject(e);
+      }
+      return deferred.promise;
+    }
+  });
+  function promiseResolve(promise, x) {
+    promiseDone(promise, 'resolved', x, promise.onResolve_);
+  }
+  function promiseReject(promise, r) {
+    promiseDone(promise, 'rejected', r, promise.onReject_);
+  }
+  function promiseDone(promise, status, value, reactions) {
+    if (promise.status_ !== 'pending')
+      return;
+    for (var i = 0; i < reactions.length; i++) {
+      promiseReact(reactions[i][0], reactions[i][1], value);
+    }
+    promise.status_ = status;
+    promise.value_ = value;
+    promise.onResolve_ = promise.onReject_ = undefined;
+  }
+  function promiseReact(deferred, handler, x) {
+    async((function() {
+      try {
+        var y = handler(x);
+        if (y === deferred.promise)
+          throw new TypeError;
+        else if (isPromise(y))
+          chain(y, deferred.resolve, deferred.reject);
+        else
+          deferred.resolve(y);
+      } catch (e) {
+        deferred.reject(e);
+      }
+    }));
+  }
+  var thenableSymbol = '@@thenable';
+  function promiseCoerce(constructor, x) {
+    if (isPromise(x)) {
+      return x;
+    } else if (x && typeof x.then === 'function') {
+      var p = x[thenableSymbol];
+      if (p) {
+        return p;
+      } else {
+        var deferred = getDeferred(constructor);
+        x[thenableSymbol] = deferred.promise;
+        try {
+          x.then(deferred.resolve, deferred.reject);
+        } catch (e) {
+          deferred.reject(e);
+        }
+        return deferred.promise;
+      }
+    } else {
+      return x;
+    }
+  }
+  return {get Promise() {
+      return Promise;
+    }};
+});
+System.register("traceur@0.0.32/src/runtime/polyfills/String", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/runtime/polyfills/String";
+  var $toString = Object.prototype.toString;
+  var $indexOf = String.prototype.indexOf;
+  var $lastIndexOf = String.prototype.lastIndexOf;
+  function startsWith(search) {
+    var string = String(this);
+    if (this == null || $toString.call(search) == '[object RegExp]') {
+      throw TypeError();
+    }
+    var stringLength = string.length;
+    var searchString = String(search);
+    var searchLength = searchString.length;
+    var position = arguments.length > 1 ? arguments[1] : undefined;
+    var pos = position ? Number(position) : 0;
+    if (isNaN(pos)) {
+      pos = 0;
+    }
+    var start = Math.min(Math.max(pos, 0), stringLength);
+    return $indexOf.call(string, searchString, pos) == start;
+  }
+  function endsWith(search) {
+    var string = String(this);
+    if (this == null || $toString.call(search) == '[object RegExp]') {
+      throw TypeError();
+    }
+    var stringLength = string.length;
+    var searchString = String(search);
+    var searchLength = searchString.length;
+    var pos = stringLength;
+    if (arguments.length > 1) {
+      var position = arguments[1];
+      if (position !== undefined) {
+        pos = position ? Number(position) : 0;
+        if (isNaN(pos)) {
+          pos = 0;
+        }
+      }
+    }
+    var end = Math.min(Math.max(pos, 0), stringLength);
+    var start = end - searchLength;
+    if (start < 0) {
+      return false;
+    }
+    return $lastIndexOf.call(string, searchString, start) == start;
+  }
+  function contains(search) {
+    if (this == null) {
+      throw TypeError();
+    }
+    var string = String(this);
+    var stringLength = string.length;
+    var searchString = String(search);
+    var searchLength = searchString.length;
+    var position = arguments.length > 1 ? arguments[1] : undefined;
+    var pos = position ? Number(position) : 0;
+    if (isNaN(pos)) {
+      pos = 0;
+    }
+    var start = Math.min(Math.max(pos, 0), stringLength);
+    return $indexOf.call(string, searchString, pos) != -1;
+  }
+  function repeat(count) {
+    if (this == null) {
+      throw TypeError();
+    }
+    var string = String(this);
+    var n = count ? Number(count) : 0;
+    if (isNaN(n)) {
+      n = 0;
+    }
+    if (n < 0 || n == Infinity) {
+      throw RangeError();
+    }
+    if (n == 0) {
+      return '';
+    }
+    var result = '';
+    while (n--) {
+      result += string;
+    }
+    return result;
+  }
+  function codePointAt(position) {
+    if (this == null) {
+      throw TypeError();
+    }
+    var string = String(this);
+    var size = string.length;
+    var index = position ? Number(position) : 0;
+    if (isNaN(index)) {
+      index = 0;
+    }
+    if (index < 0 || index >= size) {
+      return undefined;
+    }
+    var first = string.charCodeAt(index);
+    var second;
+    if (first >= 0xD800 && first <= 0xDBFF && size > index + 1) {
+      second = string.charCodeAt(index + 1);
+      if (second >= 0xDC00 && second <= 0xDFFF) {
+        return (first - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;
+      }
+    }
+    return first;
+  }
+  function raw(callsite) {
+    var raw = callsite.raw;
+    var len = raw.length >>> 0;
+    if (len === 0)
+      return '';
+    var s = '';
+    var i = 0;
+    while (true) {
+      s += raw[i];
+      if (i + 1 === len)
+        return s;
+      s += arguments[++i];
+    }
+  }
+  function fromCodePoint() {
+    var codeUnits = [];
+    var floor = Math.floor;
+    var highSurrogate;
+    var lowSurrogate;
+    var index = -1;
+    var length = arguments.length;
+    if (!length) {
+      return '';
+    }
+    while (++index < length) {
+      var codePoint = Number(arguments[index]);
+      if (!isFinite(codePoint) || codePoint < 0 || codePoint > 0x10FFFF || floor(codePoint) != codePoint) {
+        throw RangeError('Invalid code point: ' + codePoint);
+      }
+      if (codePoint <= 0xFFFF) {
+        codeUnits.push(codePoint);
+      } else {
+        codePoint -= 0x10000;
+        highSurrogate = (codePoint >> 10) + 0xD800;
+        lowSurrogate = (codePoint % 0x400) + 0xDC00;
+        codeUnits.push(highSurrogate, lowSurrogate);
+      }
+    }
+    return String.fromCharCode.apply(null, codeUnits);
+  }
+  return {
+    get startsWith() {
+      return startsWith;
+    },
+    get endsWith() {
+      return endsWith;
+    },
+    get contains() {
+      return contains;
+    },
+    get repeat() {
+      return repeat;
+    },
+    get codePointAt() {
+      return codePointAt;
+    },
+    get raw() {
+      return raw;
+    },
+    get fromCodePoint() {
+      return fromCodePoint;
+    }
+  };
+});
+System.register("traceur@0.0.32/src/runtime/polyfills/polyfills", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/runtime/polyfills/polyfills";
+  var Promise = System.get("traceur@0.0.32/src/runtime/polyfills/Promise").Promise;
+  var $__9 = System.get("traceur@0.0.32/src/runtime/polyfills/String"),
+      codePointAt = $__9.codePointAt,
+      contains = $__9.contains,
+      endsWith = $__9.endsWith,
+      fromCodePoint = $__9.fromCodePoint,
+      repeat = $__9.repeat,
+      raw = $__9.raw,
+      startsWith = $__9.startsWith;
+  var $__9 = System.get("traceur@0.0.32/src/runtime/polyfills/ArrayIterator"),
+      entries = $__9.entries,
+      keys = $__9.keys,
+      values = $__9.values;
+  function maybeDefineMethod(object, name, value) {
+    if (!(name in object)) {
+      Object.defineProperty(object, name, {
+        value: value,
+        configurable: true,
+        enumerable: false,
+        writable: true
+      });
+    }
+  }
+  function maybeAddFunctions(object, functions) {
+    for (var i = 0; i < functions.length; i += 2) {
+      var name = functions[i];
+      var value = functions[i + 1];
+      maybeDefineMethod(object, name, value);
+    }
+  }
+  function polyfillPromise(global) {
+    if (!global.Promise)
+      global.Promise = Promise;
+  }
+  function polyfillString(String) {
+    maybeAddFunctions(String.prototype, ['codePointAt', codePointAt, 'contains', contains, 'endsWith', endsWith, 'startsWith', startsWith, 'repeat', repeat]);
+    maybeAddFunctions(String, ['fromCodePoint', fromCodePoint, 'raw', raw]);
+  }
+  function polyfillArray(Array, Symbol) {
+    maybeAddFunctions(Array.prototype, ['entries', entries, 'keys', keys, 'values', values]);
+    if (Symbol && Symbol.iterator) {
+      Object.defineProperty(Array.prototype, Symbol.iterator, {
+        value: values,
+        configurable: true,
+        enumerable: false,
+        writable: true
+      });
+    }
+  }
+  function polyfill(global) {
+    polyfillPromise(global);
+    polyfillString(global.String);
+    polyfillArray(global.Array, global.Symbol);
+  }
+  polyfill(this);
+  var setupGlobals = $traceurRuntime.setupGlobals;
+  $traceurRuntime.setupGlobals = function(global) {
+    setupGlobals(global);
+    polyfill(global);
+  };
+  return {};
+});
+System.register("traceur@0.0.32/src/runtime/polyfill-import", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/runtime/polyfill-import";
+  var $__11 = System.get("traceur@0.0.32/src/runtime/polyfills/polyfills");
+  return {};
+});
+System.get("traceur@0.0.32/src/runtime/polyfill-import" + '');
+System.register("traceur@0.0.32/src/options", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/options";
+  var parseOptions = Object.create(null);
+  var transformOptions = Object.create(null);
+  var defaultValues = Object.create(null);
+  var experimentalOptions = Object.create(null);
+  var options = {
+    set experimental(v) {
+      v = coerceOptionValue(v);
+      Object.keys(experimentalOptions).forEach((function(name) {
+        options[name] = v;
+      }));
+    },
+    get experimental() {
+      var value;
+      Object.keys(experimentalOptions).every((function(name) {
+        var currentValue = options[name];
+        if (value === undefined) {
+          value = currentValue;
+          return true;
+        }
+        if (currentValue !== value) {
+          value = null;
+          return false;
+        }
+        return true;
+      }));
+      return value;
+    },
+    scripts: []
+  };
+  var descriptions = {experimental: 'Turns on all experimental features'};
+  function reset() {
+    var allOff = arguments[0];
+    var useDefault = allOff === undefined;
+    Object.keys(options).forEach((function(name) {
+      options[name] = useDefault && defaultValues[name];
+    }));
+  }
+  function fromString(s) {
+    fromArgv(s.split(/\s+/));
+  }
+  function fromArgv(args) {
+    args.forEach(parseCommand);
+  }
+  function setFromObject(object) {
+    Object.keys(object).forEach((function(name) {
+      options[name] = object[name];
+    }));
+  }
+  function coerceOptionValue(v) {
+    switch (v) {
+      case 'false':
+        return false;
+      case 'true':
+      case true:
+        return true;
+      default:
+        return !!v && String(v);
+    }
+  }
+  function setOption(name, value) {
+    name = toCamelCase(name);
+    value = coerceOptionValue(value);
+    if (name in options) {
+      options[name] = value;
+    } else {
+      throw Error('Unknown option: ' + name);
+    }
+  }
+  function addOptions(flags) {
+    Object.keys(options).forEach(function(name) {
+      var dashedName = toDashCase(name);
+      if ((name in parseOptions) && (name in transformOptions)) {
+        flags.option('--' + dashedName + ' [true|false|parse]', descriptions[name]);
+        flags.on(dashedName, (function(value) {
+          return setOption(dashedName, value);
+        }));
+      } else if (options[name] !== null) {
+        flags.option('--' + dashedName, descriptions[name]);
+        flags.on(dashedName, (function() {
+          return setOption(dashedName, true);
+        }));
+      }
+    });
+    flags.option('--referrer <name>', 'Bracket output code with System.referrerName=<name>', (function(name) {
+      setOption('referrer', name);
+      return name;
+    }));
+    flags.option('--type-assertion-module <path>', 'Absolute path to the type assertion module.', (function(path) {
+      setOption('type-assertion-module', path);
+      return path;
+    }));
+    flags.option('--script <fileName>', 'Parse as Script (must precede modules)', (function(fileName) {
+      options.scripts.push(fileName);
+    }));
+  }
+  function filterOption(dashedName) {
+    var name = toCamelCase(dashedName);
+    return name === 'experimental' || !(name in options);
+  }
+  Object.defineProperties(options, {
+    reset: {value: reset},
+    fromString: {value: fromString},
+    fromArgv: {value: fromArgv},
+    setFromObject: {value: setFromObject},
+    addOptions: {value: addOptions},
+    filterOption: {value: filterOption}
+  });
+  function parseCommand(s) {
+    var re = /--([^=]+)(?:=(.+))?/;
+    var m = re.exec(s);
+    if (m)
+      setOption(m[1], m[2] || true);
+  }
+  function toCamelCase(s) {
+    return s.replace(/-\w/g, function(ch) {
+      return ch[1].toUpperCase();
+    });
+  }
+  function toDashCase(s) {
+    return s.replace(/[A-W]/g, function(ch) {
+      return '-' + ch.toLowerCase();
+    });
+  }
+  var EXPERIMENTAL = 0;
+  var ON_BY_DEFAULT = 1;
+  function addFeatureOption(name, kind) {
+    if (kind === EXPERIMENTAL)
+      experimentalOptions[name] = true;
+    Object.defineProperty(parseOptions, name, {
+      get: function() {
+        return !!options[name];
+      },
+      enumerable: true,
+      configurable: true
+    });
+    Object.defineProperty(transformOptions, name, {
+      get: function() {
+        var v = options[name];
+        if (v === 'parse')
+          return false;
+        return v;
+      },
+      enumerable: true,
+      configurable: true
+    });
+    var defaultValue = kind === ON_BY_DEFAULT;
+    options[name] = defaultValue;
+    defaultValues[name] = defaultValue;
+  }
+  function addBoolOption(name) {
+    defaultValues[name] = false;
+    options[name] = false;
+  }
+  addFeatureOption('arrayComprehension', ON_BY_DEFAULT);
+  addFeatureOption('arrowFunctions', ON_BY_DEFAULT);
+  addFeatureOption('classes', ON_BY_DEFAULT);
+  addFeatureOption('computedPropertyNames', ON_BY_DEFAULT);
+  addFeatureOption('defaultParameters', ON_BY_DEFAULT);
+  addFeatureOption('destructuring', ON_BY_DEFAULT);
+  addFeatureOption('forOf', ON_BY_DEFAULT);
+  addFeatureOption('generatorComprehension', ON_BY_DEFAULT);
+  addFeatureOption('generators', ON_BY_DEFAULT);
+  addFeatureOption('modules', ON_BY_DEFAULT);
+  addFeatureOption('numericLiterals', ON_BY_DEFAULT);
+  addFeatureOption('propertyMethods', ON_BY_DEFAULT);
+  addFeatureOption('propertyNameShorthand', ON_BY_DEFAULT);
+  addFeatureOption('restParameters', ON_BY_DEFAULT);
+  addFeatureOption('spread', ON_BY_DEFAULT);
+  addFeatureOption('templateLiterals', ON_BY_DEFAULT);
+  addFeatureOption('blockBinding', EXPERIMENTAL);
+  addFeatureOption('symbols', EXPERIMENTAL);
+  addFeatureOption('deferredFunctions', EXPERIMENTAL);
+  addFeatureOption('types', EXPERIMENTAL);
+  addFeatureOption('annotations', EXPERIMENTAL);
+  addBoolOption('commentCallback');
+  addBoolOption('debug');
+  addBoolOption('freeVariableChecker');
+  addBoolOption('sourceMaps');
+  addBoolOption('typeAssertions');
+  addBoolOption('validate');
+  defaultValues.referrer = '';
+  options.referrer = null;
+  defaultValues.typeAssertionModule = null;
+  options.typeAssertionModule = null;
+  return {
+    get parseOptions() {
+      return parseOptions;
+    },
+    get transformOptions() {
+      return transformOptions;
+    },
+    get options() {
+      return options;
+    }
+  };
+});
+System.register("traceur@0.0.32/src/syntax/TokenType", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/syntax/TokenType";
+  var AMPERSAND = '&';
+  var AMPERSAND_EQUAL = '&=';
+  var AND = '&&';
+  var ARROW = '=>';
+  var AT = '@';
+  var AWAIT = 'await';
+  var BACK_QUOTE = '`';
+  var BANG = '!';
+  var BAR = '|';
+  var BAR_EQUAL = '|=';
+  var BREAK = 'break';
+  var CARET = '^';
+  var CARET_EQUAL = '^=';
+  var CASE = 'case';
+  var CATCH = 'catch';
+  var CLASS = 'class';
+  var CLOSE_ANGLE = '>';
+  var CLOSE_CURLY = '}';
+  var CLOSE_PAREN = ')';
+  var CLOSE_SQUARE = ']';
+  var COLON = ':';
+  var COMMA = ',';
+  var CONST = 'const';
+  var CONTINUE = 'continue';
+  var DEBUGGER = 'debugger';
+  var DEFAULT = 'default';
+  var DELETE = 'delete';
+  var DO = 'do';
+  var DOT_DOT_DOT = '...';
+  var ELSE = 'else';
+  var END_OF_FILE = 'End of File';
+  var ENUM = 'enum';
+  var EQUAL = '=';
+  var EQUAL_EQUAL = '==';
+  var EQUAL_EQUAL_EQUAL = '===';
+  var ERROR = 'error';
+  var EXPORT = 'export';
+  var EXTENDS = 'extends';
+  var FALSE = 'false';
+  var FINALLY = 'finally';
+  var FOR = 'for';
+  var FUNCTION = 'function';
+  var GREATER_EQUAL = '>=';
+  var IDENTIFIER = 'identifier';
+  var IF = 'if';
+  var IMPLEMENTS = 'implements';
+  var IMPORT = 'import';
+  var IN = 'in';
+  var INSTANCEOF = 'instanceof';
+  var INTERFACE = 'interface';
+  var LEFT_SHIFT = '<<';
+  var LEFT_SHIFT_EQUAL = '<<=';
+  var LESS_EQUAL = '<=';
+  var LET = 'let';
+  var MINUS = '-';
+  var MINUS_EQUAL = '-=';
+  var MINUS_MINUS = '--';
+  var NEW = 'new';
+  var NO_SUBSTITUTION_TEMPLATE = 'no substitution template';
+  var NOT_EQUAL = '!=';
+  var NOT_EQUAL_EQUAL = '!==';
+  var NULL = 'null';
+  var NUMBER = 'number literal';
+  var OPEN_ANGLE = '<';
+  var OPEN_CURLY = '{';
+  var OPEN_PAREN = '(';
+  var OPEN_SQUARE = '[';
+  var OR = '||';
+  var PACKAGE = 'package';
+  var PERCENT = '%';
+  var PERCENT_EQUAL = '%=';
+  var PERIOD = '.';
+  var PLUS = '+';
+  var PLUS_EQUAL = '+=';
+  var PLUS_PLUS = '++';
+  var PRIVATE = 'private';
+  var PROTECTED = 'protected';
+  var PUBLIC = 'public';
+  var QUESTION = '?';
+  var REGULAR_EXPRESSION = 'regular expression literal';
+  var RETURN = 'return';
+  var RIGHT_SHIFT = '>>';
+  var RIGHT_SHIFT_EQUAL = '>>=';
+  var SEMI_COLON = ';';
+  var SLASH = '/';
+  var SLASH_EQUAL = '/=';
+  var STAR = '*';
+  var STAR_EQUAL = '*=';
+  var STATIC = 'static';
+  var STRING = 'string literal';
+  var SUPER = 'super';
+  var SWITCH = 'switch';
+  var TEMPLATE_HEAD = 'template head';
+  var TEMPLATE_MIDDLE = 'template middle';
+  var TEMPLATE_TAIL = 'template tail';
+  var THIS = 'this';
+  var THROW = 'throw';
+  var TILDE = '~';
+  var TRUE = 'true';
+  var TRY = 'try';
+  var TYPEOF = 'typeof';
+  var UNSIGNED_RIGHT_SHIFT = '>>>';
+  var UNSIGNED_RIGHT_SHIFT_EQUAL = '>>>=';
+  var VAR = 'var';
+  var VOID = 'void';
+  var WHILE = 'while';
+  var WITH = 'with';
+  var YIELD = 'yield';
+  return {
+    get AMPERSAND() {
+      return AMPERSAND;
+    },
+    get AMPERSAND_EQUAL() {
+      return AMPERSAND_EQUAL;
+    },
+    get AND() {
+      return AND;
+    },
+    get ARROW() {
+      return ARROW;
+    },
+    get AT() {
+      return AT;
+    },
+    get AWAIT() {
+      return AWAIT;
+    },
+    get BACK_QUOTE() {
+      return BACK_QUOTE;
+    },
+    get BANG() {
+      return BANG;
+    },
+    get BAR() {
+      return BAR;
+    },
+    get BAR_EQUAL() {
+      return BAR_EQUAL;
+    },
+    get BREAK() {
+      return BREAK;
+    },
+    get CARET() {
+      return CARET;
+    },
+    get CARET_EQUAL() {
+      return CARET_EQUAL;
+    },
+    get CASE() {
+      return CASE;
+    },
+    get CATCH() {
+      return CATCH;
+    },
+    get CLASS() {
+      return CLASS;
+    },
+    get CLOSE_ANGLE() {
+      return CLOSE_ANGLE;
+    },
+    get CLOSE_CURLY() {
+      return CLOSE_CURLY;
+    },
+    get CLOSE_PAREN() {
+      return CLOSE_PAREN;
+    },
+    get CLOSE_SQUARE() {
+      return CLOSE_SQUARE;
+    },
+    get COLON() {
+      return COLON;
+    },
+    get COMMA() {
+      return COMMA;
+    },
+    get CONST() {
+      return CONST;
+    },
+    get CONTINUE() {
+      return CONTINUE;
+    },
+    get DEBUGGER() {
+      return DEBUGGER;
+    },
+    get DEFAULT() {
+      return DEFAULT;
+    },
+    get DELETE() {
+      return DELETE;
+    },
+    get DO() {
+      return DO;
+    },
+    get DOT_DOT_DOT() {
+      return DOT_DOT_DOT;
+    },
+    get ELSE() {
+      return ELSE;
+    },
+    get END_OF_FILE() {
+      return END_OF_FILE;
+    },
+    get ENUM() {
+      return ENUM;
+    },
+    get EQUAL() {
+      return EQUAL;
+    },
+    get EQUAL_EQUAL() {
+      return EQUAL_EQUAL;
+    },
+    get EQUAL_EQUAL_EQUAL() {
+      return EQUAL_EQUAL_EQUAL;
+    },
+    get ERROR() {
+      return ERROR;
+    },
+    get EXPORT() {
+      return EXPORT;
+    },
+    get EXTENDS() {
+      return EXTENDS;
+    },
+    get FALSE() {
+      return FALSE;
+    },
+    get FINALLY() {
+      return FINALLY;
+    },
+    get FOR() {
+      return FOR;
+    },
+    get FUNCTION() {
+      return FUNCTION;
+    },
+    get GREATER_EQUAL() {
+      return GREATER_EQUAL;
+    },
+    get IDENTIFIER() {
+      return IDENTIFIER;
+    },
+    get IF() {
+      return IF;
+    },
+    get IMPLEMENTS() {
+      return IMPLEMENTS;
+    },
+    get IMPORT() {
+      return IMPORT;
+    },
+    get IN() {
+      return IN;
+    },
+    get INSTANCEOF() {
+      return INSTANCEOF;
+    },
+    get INTERFACE() {
+      return INTERFACE;
+    },
+    get LEFT_SHIFT() {
+      return LEFT_SHIFT;
+    },
+    get LEFT_SHIFT_EQUAL() {
+      return LEFT_SHIFT_EQUAL;
+    },
+    get LESS_EQUAL() {
+      return LESS_EQUAL;
+    },
+    get LET() {
+      return LET;
+    },
+    get MINUS() {
+      return MINUS;
+    },
+    get MINUS_EQUAL() {
+      return MINUS_EQUAL;
+    },
+    get MINUS_MINUS() {
+      return MINUS_MINUS;
+    },
+    get NEW() {
+      return NEW;
+    },
+    get NO_SUBSTITUTION_TEMPLATE() {
+      return NO_SUBSTITUTION_TEMPLATE;
+    },
+    get NOT_EQUAL() {
+      return NOT_EQUAL;
+    },
+    get NOT_EQUAL_EQUAL() {
+      return NOT_EQUAL_EQUAL;
+    },
+    get NULL() {
+      return NULL;
+    },
+    get NUMBER() {
+      return NUMBER;
+    },
+    get OPEN_ANGLE() {
+      return OPEN_ANGLE;
+    },
+    get OPEN_CURLY() {
+      return OPEN_CURLY;
+    },
+    get OPEN_PAREN() {
+      return OPEN_PAREN;
+    },
+    get OPEN_SQUARE() {
+      return OPEN_SQUARE;
+    },
+    get OR() {
+      return OR;
+    },
+    get PACKAGE() {
+      return PACKAGE;
+    },
+    get PERCENT() {
+      return PERCENT;
+    },
+    get PERCENT_EQUAL() {
+      return PERCENT_EQUAL;
+    },
+    get PERIOD() {
+      return PERIOD;
+    },
+    get PLUS() {
+      return PLUS;
+    },
+    get PLUS_EQUAL() {
+      return PLUS_EQUAL;
+    },
+    get PLUS_PLUS() {
+      return PLUS_PLUS;
+    },
+    get PRIVATE() {
+      return PRIVATE;
+    },
+    get PROTECTED() {
+      return PROTECTED;
+    },
+    get PUBLIC() {
+      return PUBLIC;
+    },
+    get QUESTION() {
+      return QUESTION;
+    },
+    get REGULAR_EXPRESSION() {
+      return REGULAR_EXPRESSION;
+    },
+    get RETURN() {
+      return RETURN;
+    },
+    get RIGHT_SHIFT() {
+      return RIGHT_SHIFT;
+    },
+    get RIGHT_SHIFT_EQUAL() {
+      return RIGHT_SHIFT_EQUAL;
+    },
+    get SEMI_COLON() {
+      return SEMI_COLON;
+    },
+    get SLASH() {
+      return SLASH;
+    },
+    get SLASH_EQUAL() {
+      return SLASH_EQUAL;
+    },
+    get STAR() {
+      return STAR;
+    },
+    get STAR_EQUAL() {
+      return STAR_EQUAL;
+    },
+    get STATIC() {
+      return STATIC;
+    },
+    get STRING() {
+      return STRING;
+    },
+    get SUPER() {
+      return SUPER;
+    },
+    get SWITCH() {
+      return SWITCH;
+    },
+    get TEMPLATE_HEAD() {
+      return TEMPLATE_HEAD;
+    },
+    get TEMPLATE_MIDDLE() {
+      return TEMPLATE_MIDDLE;
+    },
+    get TEMPLATE_TAIL() {
+      return TEMPLATE_TAIL;
+    },
+    get THIS() {
+      return THIS;
+    },
+    get THROW() {
+      return THROW;
+    },
+    get TILDE() {
+      return TILDE;
+    },
+    get TRUE() {
+      return TRUE;
+    },
+    get TRY() {
+      return TRY;
+    },
+    get TYPEOF() {
+      return TYPEOF;
+    },
+    get UNSIGNED_RIGHT_SHIFT() {
+      return UNSIGNED_RIGHT_SHIFT;
+    },
+    get UNSIGNED_RIGHT_SHIFT_EQUAL() {
+      return UNSIGNED_RIGHT_SHIFT_EQUAL;
+    },
+    get VAR() {
+      return VAR;
+    },
+    get VOID() {
+      return VOID;
+    },
+    get WHILE() {
+      return WHILE;
+    },
+    get WITH() {
+      return WITH;
+    },
+    get YIELD() {
+      return YIELD;
+    }
+  };
+});
+System.register("traceur@0.0.32/src/syntax/Token", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/syntax/Token";
+  var $__13 = System.get("traceur@0.0.32/src/syntax/TokenType"),
+      AMPERSAND_EQUAL = $__13.AMPERSAND_EQUAL,
+      BAR_EQUAL = $__13.BAR_EQUAL,
+      CARET_EQUAL = $__13.CARET_EQUAL,
+      EQUAL = $__13.EQUAL,
+      LEFT_SHIFT_EQUAL = $__13.LEFT_SHIFT_EQUAL,
+      MINUS_EQUAL = $__13.MINUS_EQUAL,
+      PERCENT_EQUAL = $__13.PERCENT_EQUAL,
+      PLUS_EQUAL = $__13.PLUS_EQUAL,
+      RIGHT_SHIFT_EQUAL = $__13.RIGHT_SHIFT_EQUAL,
+      SLASH_EQUAL = $__13.SLASH_EQUAL,
+      STAR_EQUAL = $__13.STAR_EQUAL,
+      UNSIGNED_RIGHT_SHIFT_EQUAL = $__13.UNSIGNED_RIGHT_SHIFT_EQUAL;
+  var Token = function Token(type, location) {
+    this.type = type;
+    this.location = location;
+  };
+  ($traceurRuntime.createClass)(Token, {
+    toString: function() {
+      return this.type;
+    },
+    isAssignmentOperator: function() {
+      return isAssignmentOperator(this.type);
+    },
+    isKeyword: function() {
+      return false;
+    },
+    isStrictKeyword: function() {
+      return false;
+    }
+  }, {});
+  function isAssignmentOperator(type) {
+    switch (type) {
+      case AMPERSAND_EQUAL:
+      case BAR_EQUAL:
+      case CARET_EQUAL:
+      case EQUAL:
+      case LEFT_SHIFT_EQUAL:
+      case MINUS_EQUAL:
+      case PERCENT_EQUAL:
+      case PLUS_EQUAL:
+      case RIGHT_SHIFT_EQUAL:
+      case SLASH_EQUAL:
+      case STAR_EQUAL:
+      case UNSIGNED_RIGHT_SHIFT_EQUAL:
+        return true;
+    }
+    return false;
+  }
+  return {
+    get Token() {
+      return Token;
+    },
+    get isAssignmentOperator() {
+      return isAssignmentOperator;
+    }
+  };
+});
+System.register("traceur@0.0.32/src/syntax/IdentifierToken", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/syntax/IdentifierToken";
+  var Token = System.get("traceur@0.0.32/src/syntax/Token").Token;
+  var IDENTIFIER = System.get("traceur@0.0.32/src/syntax/TokenType").IDENTIFIER;
+  var IdentifierToken = function IdentifierToken(location, value) {
+    this.location = location;
+    this.value = value;
+  };
+  ($traceurRuntime.createClass)(IdentifierToken, {
+    toString: function() {
+      return this.value;
+    },
+    get type() {
+      return IDENTIFIER;
+    }
+  }, {}, Token);
+  return {get IdentifierToken() {
+      return IdentifierToken;
+    }};
+});
+System.register("traceur@0.0.32/src/syntax/ParseTreeVisitor", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/syntax/ParseTreeVisitor";
+  var ParseTreeVisitor = function ParseTreeVisitor() {};
+  ($traceurRuntime.createClass)(ParseTreeVisitor, {
+    visitAny: function(tree) {
+      tree && tree.visit(this);
+    },
+    visit: function(tree) {
+      this.visitAny(tree);
+    },
+    visitList: function(list) {
+      if (list) {
+        for (var i = 0; i < list.length; i++) {
+          this.visitAny(list[i]);
+        }
+      }
+    },
+    visitStateMachine: function(tree) {
+      throw Error('State machines should not live outside of the GeneratorTransformer.');
+    },
+    visitAnnotation: function(tree) {
+      this.visitAny(tree.name);
+      this.visitAny(tree.args);
+    },
+    visitAnonBlock: function(tree) {
+      this.visitList(tree.statements);
+    },
+    visitArgumentList: function(tree) {
+      this.visitList(tree.args);
+    },
+    visitArrayComprehension: function(tree) {
+      this.visitList(tree.comprehensionList);
+      this.visitAny(tree.expression);
+    },
+    visitArrayLiteralExpression: function(tree) {
+      this.visitList(tree.elements);
+    },
+    visitArrayPattern: function(tree) {
+      this.visitList(tree.elements);
+    },
+    visitArrowFunctionExpression: function(tree) {
+      this.visitAny(tree.formalParameters);
+      this.visitAny(tree.functionBody);
+    },
+    visitAwaitStatement: function(tree) {
+      this.visitAny(tree.expression);
+    },
+    visitBinaryOperator: function(tree) {
+      this.visitAny(tree.left);
+      this.visitAny(tree.right);
+    },
+    visitBindingElement: function(tree) {
+      this.visitAny(tree.binding);
+      this.visitAny(tree.initialiser);
+    },
+    visitBindingIdentifier: function(tree) {},
+    visitBlock: function(tree) {
+      this.visitList(tree.statements);
+    },
+    visitBreakStatement: function(tree) {},
+    visitCallExpression: function(tree) {
+      this.visitAny(tree.operand);
+      this.visitAny(tree.args);
+    },
+    visitCaseClause: function(tree) {
+      this.visitAny(tree.expression);
+      this.visitList(tree.statements);
+    },
+    visitCatch: function(tree) {
+      this.visitAny(tree.binding);
+      this.visitAny(tree.catchBody);
+    },
+    visitClassDeclaration: function(tree) {
+      this.visitAny(tree.name);
+      this.visitAny(tree.superClass);
+      this.visitList(tree.elements);
+      this.visitList(tree.annotations);
+    },
+    visitClassExpression: function(tree) {
+      this.visitAny(tree.name);
+      this.visitAny(tree.superClass);
+      this.visitList(tree.elements);
+      this.visitList(tree.annotations);
+    },
+    visitCommaExpression: function(tree) {
+      this.visitList(tree.expressions);
+    },
+    visitComprehensionFor: function(tree) {
+      this.visitAny(tree.left);
+      this.visitAny(tree.iterator);
+    },
+    visitComprehensionIf: function(tree) {
+      this.visitAny(tree.expression);
+    },
+    visitComputedPropertyName: function(tree) {
+      this.visitAny(tree.expression);
+    },
+    visitConditionalExpression: function(tree) {
+      this.visitAny(tree.condition);
+      this.visitAny(tree.left);
+      this.visitAny(tree.right);
+    },
+    visitContinueStatement: function(tree) {},
+    visitCoverFormals: function(tree) {
+      this.visitList(tree.expressions);
+    },
+    visitCoverInitialisedName: function(tree) {
+      this.visitAny(tree.initialiser);
+    },
+    visitDebuggerStatement: function(tree) {},
+    visitDefaultClause: function(tree) {
+      this.visitList(tree.statements);
+    },
+    visitDoWhileStatement: function(tree) {
+      this.visitAny(tree.body);
+      this.visitAny(tree.condition);
+    },
+    visitEmptyStatement: function(tree) {},
+    visitExportDeclaration: function(tree) {
+      this.visitAny(tree.declaration);
+      this.visitList(tree.annotations);
+    },
+    visitExportDefault: function(tree) {
+      this.visitAny(tree.expression);
+    },
+    visitExportSpecifier: function(tree) {},
+    visitExportSpecifierSet: function(tree) {
+      this.visitList(tree.specifiers);
+    },
+    visitExportStar: function(tree) {},
+    visitExpressionStatement: function(tree) {
+      this.visitAny(tree.expression);
+    },
+    visitFinally: function(tree) {
+      this.visitAny(tree.block);
+    },
+    visitForInStatement: function(tree) {
+      this.visitAny(tree.initialiser);
+      this.visitAny(tree.collection);
+      this.visitAny(tree.body);
+    },
+    visitForOfStatement: function(tree) {
+      this.visitAny(tree.initialiser);
+      this.visitAny(tree.collection);
+      this.visitAny(tree.body);
+    },
+    visitForStatement: function(tree) {
+      this.visitAny(tree.initialiser);
+      this.visitAny(tree.condition);
+      this.visitAny(tree.increment);
+      this.visitAny(tree.body);
+    },
+    visitFormalParameter: function(tree) {
+      this.visitAny(tree.parameter);
+      this.visitAny(tree.typeAnnotation);
+      this.visitList(tree.annotations);
+    },
+    visitFormalParameterList: function(tree) {
+      this.visitList(tree.parameters);
+    },
+    visitFunctionBody: function(tree) {
+      this.visitList(tree.statements);
+    },
+    visitFunctionDeclaration: function(tree) {
+      this.visitAny(tree.name);
+      this.visitAny(tree.formalParameterList);
+      this.visitAny(tree.typeAnnotation);
+      this.visitList(tree.annotations);
+      this.visitAny(tree.functionBody);
+    },
+    visitFunctionExpression: function(tree) {
+      this.visitAny(tree.name);
+      this.visitAny(tree.formalParameterList);
+      this.visitAny(tree.typeAnnotation);
+      this.visitList(tree.annotations);
+      this.visitAny(tree.functionBody);
+    },
+    visitGeneratorComprehension: function(tree) {
+      this.visitList(tree.comprehensionList);
+      this.visitAny(tree.expression);
+    },
+    visitGetAccessor: function(tree) {
+      this.visitAny(tree.name);
+      this.visitAny(tree.typeAnnotation);
+      this.visitList(tree.annotations);
+      this.visitAny(tree.body);
+    },
+    visitIdentifierExpression: function(tree) {},
+    visitIfStatement: function(tree) {
+      this.visitAny(tree.condition);
+      this.visitAny(tree.ifClause);
+      this.visitAny(tree.elseClause);
+    },
+    visitImportedBinding: function(tree) {
+      this.visitAny(tree.binding);
+    },
+    visitImportDeclaration: function(tree) {
+      this.visitAny(tree.importClause);
+      this.visitAny(tree.moduleSpecifier);
+    },
+    visitImportSpecifier: function(tree) {},
+    visitImportSpecifierSet: function(tree) {
+      this.visitList(tree.specifiers);
+    },
+    visitLabelledStatement: function(tree) {
+      this.visitAny(tree.statement);
+    },
+    visitLiteralExpression: function(tree) {},
+    visitLiteralPropertyName: function(tree) {},
+    visitMemberExpression: function(tree) {
+      this.visitAny(tree.operand);
+    },
+    visitMemberLookupExpression: function(tree) {
+      this.visitAny(tree.operand);
+      this.visitAny(tree.memberExpression);
+    },
+    visitModule: function(tree) {
+      this.visitList(tree.scriptItemList);
+    },
+    visitModuleDeclaration: function(tree) {
+      this.visitAny(tree.expression);
+    },
+    visitModuleSpecifier: function(tree) {},
+    visitNamedExport: function(tree) {
+      this.visitAny(tree.moduleSpecifier);
+      this.visitAny(tree.specifierSet);
+    },
+    visitNewExpression: function(tree) {
+      this.visitAny(tree.operand);
+      this.visitAny(tree.args);
+    },
+    visitObjectLiteralExpression: function(tree) {
+      this.visitList(tree.propertyNameAndValues);
+    },
+    visitObjectPattern: function(tree) {
+      this.visitList(tree.fields);
+    },
+    visitObjectPatternField: function(tree) {
+      this.visitAny(tree.name);
+      this.visitAny(tree.element);
+    },
+    visitParenExpression: function(tree) {
+      this.visitAny(tree.expression);
+    },
+    visitPostfixExpression: function(tree) {
+      this.visitAny(tree.operand);
+    },
+    visitPredefinedType: function(tree) {},
+    visitScript: function(tree) {
+      this.visitList(tree.scriptItemList);
+    },
+    visitPropertyMethodAssignment: function(tree) {
+      this.visitAny(tree.name);
+      this.visitAny(tree.formalParameterList);
+      this.visitAny(tree.typeAnnotation);
+      this.visitList(tree.annotations);
+      this.visitAny(tree.functionBody);
+    },
+    visitPropertyNameAssignment: function(tree) {
+      this.visitAny(tree.name);
+      this.visitAny(tree.value);
+    },
+    visitPropertyNameShorthand: function(tree) {},
+    visitRestParameter: function(tree) {
+      this.visitAny(tree.identifier);
+    },
+    visitReturnStatement: function(tree) {
+      this.visitAny(tree.expression);
+    },
+    visitSetAccessor: function(tree) {
+      this.visitAny(tree.name);
+      this.visitAny(tree.parameter);
+      this.visitList(tree.annotations);
+      this.visitAny(tree.body);
+    },
+    visitSpreadExpression: function(tree) {
+      this.visitAny(tree.expression);
+    },
+    visitSpreadPatternElement: function(tree) {
+      this.visitAny(tree.lvalue);
+    },
+    visitSuperExpression: function(tree) {},
+    visitSwitchStatement: function(tree) {
+      this.visitAny(tree.expression);
+      this.visitList(tree.caseClauses);
+    },
+    visitSyntaxErrorTree: function(tree) {},
+    visitTemplateLiteralExpression: function(tree) {
+      this.visitAny(tree.operand);
+      this.visitList(tree.elements);
+    },
+    visitTemplateLiteralPortion: function(tree) {},
+    visitTemplateSubstitution: function(tree) {
+      this.visitAny(tree.expression);
+    },
+    visitThisExpression: function(tree) {},
+    visitThrowStatement: function(tree) {
+      this.visitAny(tree.value);
+    },
+    visitTryStatement: function(tree) {
+      this.visitAny(tree.body);
+      this.visitAny(tree.catchBlock);
+      this.visitAny(tree.finallyBlock);
+    },
+    visitTypeName: function(tree) {
+      this.visitAny(tree.moduleName);
+    },
+    visitUnaryExpression: function(tree) {
+      this.visitAny(tree.operand);
+    },
+    visitVariableDeclaration: function(tree) {
+      this.visitAny(tree.lvalue);
+      this.visitAny(tree.typeAnnotation);
+      this.visitAny(tree.initialiser);
+    },
+    visitVariableDeclarationList: function(tree) {
+      this.visitList(tree.declarations);
+    },
+    visitVariableStatement: function(tree) {
+      this.visitAny(tree.declarations);
+    },
+    visitWhileStatement: function(tree) {
+      this.visitAny(tree.condition);
+      this.visitAny(tree.body);
+    },
+    visitWithStatement: function(tree) {
+      this.visitAny(tree.expression);
+      this.visitAny(tree.body);
+    },
+    visitYieldExpression: function(tree) {
+      this.visitAny(tree.expression);
+    }
+  }, {});
+  return {get ParseTreeVisitor() {
+      return ParseTreeVisitor;
+    }};
+});
+System.register("traceur@0.0.32/src/syntax/PredefinedName", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/syntax/PredefinedName";
+  var ANY = 'any';
+  var $ARGUMENTS = '$arguments';
+  var APPLY = 'apply';
+  var ARGUMENTS = 'arguments';
+  var ARRAY = 'Array';
+  var AS = 'as';
+  var BIND = 'bind';
+  var CALL = 'call';
+  var CONFIGURABLE = 'configurable';
+  var CONSTRUCTOR = 'constructor';
+  var CREATE = 'create';
+  var CURRENT = 'current';
+  var DEFINE_PROPERTIES = 'defineProperties';
+  var DEFINE_PROPERTY = 'defineProperty';
+  var ENUMERABLE = 'enumerable';
+  var FREEZE = 'freeze';
+  var FROM = 'from';
+  var FUNCTION = 'Function';
+  var GET = 'get';
+  var HAS = 'has';
+  var LENGTH = 'length';
+  var MODULE = 'module';
+  var NEW = 'new';
+  var OBJECT = 'Object';
+  var OBJECT_NAME = 'Object';
+  var OF = 'of';
+  var PREVENT_EXTENSIONS = 'preventExtensions';
+  var PROTOTYPE = 'prototype';
+  var PUSH = 'push';
+  var RAW = 'raw';
+  var SET = 'set';
+  var SLICE = 'slice';
+  var THIS = 'this';
+  var TRACEUR_RUNTIME = '$traceurRuntime';
+  var UNDEFINED = 'undefined';
+  var WRITABLE = 'writable';
+  function getParameterName(index) {
+    return '$' + index;
+  }
+  ;
+  return {
+    get ANY() {
+      return ANY;
+    },
+    get $ARGUMENTS() {
+      return $ARGUMENTS;
+    },
+    get APPLY() {
+      return APPLY;
+    },
+    get ARGUMENTS() {
+      return ARGUMENTS;
+    },
+    get ARRAY() {
+      return ARRAY;
+    },
+    get AS() {
+      return AS;
+    },
+    get BIND() {
+      return BIND;
+    },
+    get CALL() {
+      return CALL;
+    },
+    get CONFIGURABLE() {
+      return CONFIGURABLE;
+    },
+    get CONSTRUCTOR() {
+      return CONSTRUCTOR;
+    },
+    get CREATE() {
+      return CREATE;
+    },
+    get CURRENT() {
+      return CURRENT;
+    },
+    get DEFINE_PROPERTIES() {
+      return DEFINE_PROPERTIES;
+    },
+    get DEFINE_PROPERTY() {
+      return DEFINE_PROPERTY;
+    },
+    get ENUMERABLE() {
+      return ENUMERABLE;
+    },
+    get FREEZE() {
+      return FREEZE;
+    },
+    get FROM() {
+      return FROM;
+    },
+    get FUNCTION() {
+      return FUNCTION;
+    },
+    get GET() {
+      return GET;
+    },
+    get HAS() {
+      return HAS;
+    },
+    get LENGTH() {
+      return LENGTH;
+    },
+    get MODULE() {
+      return MODULE;
+    },
+    get NEW() {
+      return NEW;
+    },
+    get OBJECT() {
+      return OBJECT;
+    },
+    get OBJECT_NAME() {
+      return OBJECT_NAME;
+    },
+    get OF() {
+      return OF;
+    },
+    get PREVENT_EXTENSIONS() {
+      return PREVENT_EXTENSIONS;
+    },
+    get PROTOTYPE() {
+      return PROTOTYPE;
+    },
+    get PUSH() {
+      return PUSH;
+    },
+    get RAW() {
+      return RAW;
+    },
+    get SET() {
+      return SET;
+    },
+    get SLICE() {
+      return SLICE;
+    },
+    get THIS() {
+      return THIS;
+    },
+    get TRACEUR_RUNTIME() {
+      return TRACEUR_RUNTIME;
+    },
+    get UNDEFINED() {
+      return UNDEFINED;
+    },
+    get WRITABLE() {
+      return WRITABLE;
+    },
+    get getParameterName() {
+      return getParameterName;
+    }
+  };
+});
+System.register("traceur@0.0.32/src/syntax/trees/ParseTreeType", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/syntax/trees/ParseTreeType";
+  var ANNOTATION = 'ANNOTATION';
+  var ANON_BLOCK = 'ANON_BLOCK';
+  var ARGUMENT_LIST = 'ARGUMENT_LIST';
+  var ARRAY_COMPREHENSION = 'ARRAY_COMPREHENSION';
+  var ARRAY_LITERAL_EXPRESSION = 'ARRAY_LITERAL_EXPRESSION';
+  var ARRAY_PATTERN = 'ARRAY_PATTERN';
+  var ARROW_FUNCTION_EXPRESSION = 'ARROW_FUNCTION_EXPRESSION';
+  var AWAIT_STATEMENT = 'AWAIT_STATEMENT';
+  var BINARY_OPERATOR = 'BINARY_OPERATOR';
+  var BINDING_ELEMENT = 'BINDING_ELEMENT';
+  var BINDING_IDENTIFIER = 'BINDING_IDENTIFIER';
+  var BLOCK = 'BLOCK';
+  var BREAK_STATEMENT = 'BREAK_STATEMENT';
+  var CALL_EXPRESSION = 'CALL_EXPRESSION';
+  var CASE_CLAUSE = 'CASE_CLAUSE';
+  var CATCH = 'CATCH';
+  var CLASS_DECLARATION = 'CLASS_DECLARATION';
+  var CLASS_EXPRESSION = 'CLASS_EXPRESSION';
+  var COMMA_EXPRESSION = 'COMMA_EXPRESSION';
+  var COMPREHENSION_FOR = 'COMPREHENSION_FOR';
+  var COMPREHENSION_IF = 'COMPREHENSION_IF';
+  var COMPUTED_PROPERTY_NAME = 'COMPUTED_PROPERTY_NAME';
+  var CONDITIONAL_EXPRESSION = 'CONDITIONAL_EXPRESSION';
+  var CONTINUE_STATEMENT = 'CONTINUE_STATEMENT';
+  var COVER_FORMALS = 'COVER_FORMALS';
+  var COVER_INITIALISED_NAME = 'COVER_INITIALISED_NAME';
+  var DEBUGGER_STATEMENT = 'DEBUGGER_STATEMENT';
+  var DEFAULT_CLAUSE = 'DEFAULT_CLAUSE';
+  var DO_WHILE_STATEMENT = 'DO_WHILE_STATEMENT';
+  var EMPTY_STATEMENT = 'EMPTY_STATEMENT';
+  var EXPORT_DECLARATION = 'EXPORT_DECLARATION';
+  var EXPORT_DEFAULT = 'EXPORT_DEFAULT';
+  var EXPORT_SPECIFIER = 'EXPORT_SPECIFIER';
+  var EXPORT_SPECIFIER_SET = 'EXPORT_SPECIFIER_SET';
+  var EXPORT_STAR = 'EXPORT_STAR';
+  var EXPRESSION_STATEMENT = 'EXPRESSION_STATEMENT';
+  var FINALLY = 'FINALLY';
+  var FOR_IN_STATEMENT = 'FOR_IN_STATEMENT';
+  var FOR_OF_STATEMENT = 'FOR_OF_STATEMENT';
+  var FOR_STATEMENT = 'FOR_STATEMENT';
+  var FORMAL_PARAMETER = 'FORMAL_PARAMETER';
+  var FORMAL_PARAMETER_LIST = 'FORMAL_PARAMETER_LIST';
+  var FUNCTION_BODY = 'FUNCTION_BODY';
+  var FUNCTION_DECLARATION = 'FUNCTION_DECLARATION';
+  var FUNCTION_EXPRESSION = 'FUNCTION_EXPRESSION';
+  var GENERATOR_COMPREHENSION = 'GENERATOR_COMPREHENSION';
+  var GET_ACCESSOR = 'GET_ACCESSOR';
+  var IDENTIFIER_EXPRESSION = 'IDENTIFIER_EXPRESSION';
+  var IF_STATEMENT = 'IF_STATEMENT';
+  var IMPORT_DECLARATION = 'IMPORT_DECLARATION';
+  var IMPORT_SPECIFIER = 'IMPORT_SPECIFIER';
+  var IMPORT_SPECIFIER_SET = 'IMPORT_SPECIFIER_SET';
+  var IMPORTED_BINDING = 'IMPORTED_BINDING';
+  var LABELLED_STATEMENT = 'LABELLED_STATEMENT';
+  var LITERAL_EXPRESSION = 'LITERAL_EXPRESSION';
+  var LITERAL_PROPERTY_NAME = 'LITERAL_PROPERTY_NAME';
+  var MEMBER_EXPRESSION = 'MEMBER_EXPRESSION';
+  var MEMBER_LOOKUP_EXPRESSION = 'MEMBER_LOOKUP_EXPRESSION';
+  var MODULE = 'MODULE';
+  var MODULE_DECLARATION = 'MODULE_DECLARATION';
+  var MODULE_SPECIFIER = 'MODULE_SPECIFIER';
+  var NAMED_EXPORT = 'NAMED_EXPORT';
+  var NEW_EXPRESSION = 'NEW_EXPRESSION';
+  var OBJECT_LITERAL_EXPRESSION = 'OBJECT_LITERAL_EXPRESSION';
+  var OBJECT_PATTERN = 'OBJECT_PATTERN';
+  var OBJECT_PATTERN_FIELD = 'OBJECT_PATTERN_FIELD';
+  var PAREN_EXPRESSION = 'PAREN_EXPRESSION';
+  var POSTFIX_EXPRESSION = 'POSTFIX_EXPRESSION';
+  var PREDEFINED_TYPE = 'PREDEFINED_TYPE';
+  var PROPERTY_METHOD_ASSIGNMENT = 'PROPERTY_METHOD_ASSIGNMENT';
+  var PROPERTY_NAME_ASSIGNMENT = 'PROPERTY_NAME_ASSIGNMENT';
+  var PROPERTY_NAME_SHORTHAND = 'PROPERTY_NAME_SHORTHAND';
+  var REST_PARAMETER = 'REST_PARAMETER';
+  var RETURN_STATEMENT = 'RETURN_STATEMENT';
+  var SCRIPT = 'SCRIPT';
+  var SET_ACCESSOR = 'SET_ACCESSOR';
+  var SPREAD_EXPRESSION = 'SPREAD_EXPRESSION';
+  var SPREAD_PATTERN_ELEMENT = 'SPREAD_PATTERN_ELEMENT';
+  var STATE_MACHINE = 'STATE_MACHINE';
+  var SUPER_EXPRESSION = 'SUPER_EXPRESSION';
+  var SWITCH_STATEMENT = 'SWITCH_STATEMENT';
+  var SYNTAX_ERROR_TREE = 'SYNTAX_ERROR_TREE';
+  var TEMPLATE_LITERAL_EXPRESSION = 'TEMPLATE_LITERAL_EXPRESSION';
+  var TEMPLATE_LITERAL_PORTION = 'TEMPLATE_LITERAL_PORTION';
+  var TEMPLATE_SUBSTITUTION = 'TEMPLATE_SUBSTITUTION';
+  var THIS_EXPRESSION = 'THIS_EXPRESSION';
+  var THROW_STATEMENT = 'THROW_STATEMENT';
+  var TRY_STATEMENT = 'TRY_STATEMENT';
+  var TYPE_NAME = 'TYPE_NAME';
+  var UNARY_EXPRESSION = 'UNARY_EXPRESSION';
+  var VARIABLE_DECLARATION = 'VARIABLE_DECLARATION';
+  var VARIABLE_DECLARATION_LIST = 'VARIABLE_DECLARATION_LIST';
+  var VARIABLE_STATEMENT = 'VARIABLE_STATEMENT';
+  var WHILE_STATEMENT = 'WHILE_STATEMENT';
+  var WITH_STATEMENT = 'WITH_STATEMENT';
+  var YIELD_EXPRESSION = 'YIELD_EXPRESSION';
+  return {
+    get ANNOTATION() {
+      return ANNOTATION;
+    },
+    get ANON_BLOCK() {
+      return ANON_BLOCK;
+    },
+    get ARGUMENT_LIST() {
+      return ARGUMENT_LIST;
+    },
+    get ARRAY_COMPREHENSION() {
+      return ARRAY_COMPREHENSION;
+    },
+    get ARRAY_LITERAL_EXPRESSION() {
+      return ARRAY_LITERAL_EXPRESSION;
+    },
+    get ARRAY_PATTERN() {
+      return ARRAY_PATTERN;
+    },
+    get ARROW_FUNCTION_EXPRESSION() {
+      return ARROW_FUNCTION_EXPRESSION;
+    },
+    get AWAIT_STATEMENT() {
+      return AWAIT_STATEMENT;
+    },
+    get BINARY_OPERATOR() {
+      return BINARY_OPERATOR;
+    },
+    get BINDING_ELEMENT() {
+      return BINDING_ELEMENT;
+    },
+    get BINDING_IDENTIFIER() {
+      return BINDING_IDENTIFIER;
+    },
+    get BLOCK() {
+      return BLOCK;
+    },
+    get BREAK_STATEMENT() {
+      return BREAK_STATEMENT;
+    },
+    get CALL_EXPRESSION() {
+      return CALL_EXPRESSION;
+    },
+    get CASE_CLAUSE() {
+      return CASE_CLAUSE;
+    },
+    get CATCH() {
+      return CATCH;
+    },
+    get CLASS_DECLARATION() {
+      return CLASS_DECLARATION;
+    },
+    get CLASS_EXPRESSION() {
+      return CLASS_EXPRESSION;
+    },
+    get COMMA_EXPRESSION() {
+      return COMMA_EXPRESSION;
+    },
+    get COMPREHENSION_FOR() {
+      return COMPREHENSION_FOR;
+    },
+    get COMPREHENSION_IF() {
+      return COMPREHENSION_IF;
+    },
+    get COMPUTED_PROPERTY_NAME() {
+      return COMPUTED_PROPERTY_NAME;
+    },
+    get CONDITIONAL_EXPRESSION() {
+      return CONDITIONAL_EXPRESSION;
+    },
+    get CONTINUE_STATEMENT() {
+      return CONTINUE_STATEMENT;
+    },
+    get COVER_FORMALS() {
+      return COVER_FORMALS;
+    },
+    get COVER_INITIALISED_NAME() {
+      return COVER_INITIALISED_NAME;
+    },
+    get DEBUGGER_STATEMENT() {
+      return DEBUGGER_STATEMENT;
+    },
+    get DEFAULT_CLAUSE() {
+      return DEFAULT_CLAUSE;
+    },
+    get DO_WHILE_STATEMENT() {
+      return DO_WHILE_STATEMENT;
+    },
+    get EMPTY_STATEMENT() {
+      return EMPTY_STATEMENT;
+    },
+    get EXPORT_DECLARATION() {
+      return EXPORT_DECLARATION;
+    },
+    get EXPORT_DEFAULT() {
+      return EXPORT_DEFAULT;
+    },
+    get EXPORT_SPECIFIER() {
+      return EXPORT_SPECIFIER;
+    },
+    get EXPORT_SPECIFIER_SET() {
+      return EXPORT_SPECIFIER_SET;
+    },
+    get EXPORT_STAR() {
+      return EXPORT_STAR;
+    },
+    get EXPRESSION_STATEMENT() {
+      return EXPRESSION_STATEMENT;
+    },
+    get FINALLY() {
+      return FINALLY;
+    },
+    get FOR_IN_STATEMENT() {
+      return FOR_IN_STATEMENT;
+    },
+    get FOR_OF_STATEMENT() {
+      return FOR_OF_STATEMENT;
+    },
+    get FOR_STATEMENT() {
+      return FOR_STATEMENT;
+    },
+    get FORMAL_PARAMETER() {
+      return FORMAL_PARAMETER;
+    },
+    get FORMAL_PARAMETER_LIST() {
+      return FORMAL_PARAMETER_LIST;
+    },
+    get FUNCTION_BODY() {
+      return FUNCTION_BODY;
+    },
+    get FUNCTION_DECLARATION() {
+      return FUNCTION_DECLARATION;
+    },
+    get FUNCTION_EXPRESSION() {
+      return FUNCTION_EXPRESSION;
+    },
+    get GENERATOR_COMPREHENSION() {
+      return GENERATOR_COMPREHENSION;
+    },
+    get GET_ACCESSOR() {
+      return GET_ACCESSOR;
+    },
+    get IDENTIFIER_EXPRESSION() {
+      return IDENTIFIER_EXPRESSION;
+    },
+    get IF_STATEMENT() {
+      return IF_STATEMENT;
+    },
+    get IMPORT_DECLARATION() {
+      return IMPORT_DECLARATION;
+    },
+    get IMPORT_SPECIFIER() {
+      return IMPORT_SPECIFIER;
+    },
+    get IMPORT_SPECIFIER_SET() {
+      return IMPORT_SPECIFIER_SET;
+    },
+    get IMPORTED_BINDING() {
+      return IMPORTED_BINDING;
+    },
+    get LABELLED_STATEMENT() {
+      return LABELLED_STATEMENT;
+    },
+    get LITERAL_EXPRESSION() {
+      return LITERAL_EXPRESSION;
+    },
+    get LITERAL_PROPERTY_NAME() {
+      return LITERAL_PROPERTY_NAME;
+    },
+    get MEMBER_EXPRESSION() {
+      return MEMBER_EXPRESSION;
+    },
+    get MEMBER_LOOKUP_EXPRESSION() {
+      return MEMBER_LOOKUP_EXPRESSION;
+    },
+    get MODULE() {
+      return MODULE;
+    },
+    get MODULE_DECLARATION() {
+      return MODULE_DECLARATION;
+    },
+    get MODULE_SPECIFIER() {
+      return MODULE_SPECIFIER;
+    },
+    get NAMED_EXPORT() {
+      return NAMED_EXPORT;
+    },
+    get NEW_EXPRESSION() {
+      return NEW_EXPRESSION;
+    },
+    get OBJECT_LITERAL_EXPRESSION() {
+      return OBJECT_LITERAL_EXPRESSION;
+    },
+    get OBJECT_PATTERN() {
+      return OBJECT_PATTERN;
+    },
+    get OBJECT_PATTERN_FIELD() {
+      return OBJECT_PATTERN_FIELD;
+    },
+    get PAREN_EXPRESSION() {
+      return PAREN_EXPRESSION;
+    },
+    get POSTFIX_EXPRESSION() {
+      return POSTFIX_EXPRESSION;
+    },
+    get PREDEFINED_TYPE() {
+      return PREDEFINED_TYPE;
+    },
+    get PROPERTY_METHOD_ASSIGNMENT() {
+      return PROPERTY_METHOD_ASSIGNMENT;
+    },
+    get PROPERTY_NAME_ASSIGNMENT() {
+      return PROPERTY_NAME_ASSIGNMENT;
+    },
+    get PROPERTY_NAME_SHORTHAND() {
+      return PROPERTY_NAME_SHORTHAND;
+    },
+    get REST_PARAMETER() {
+      return REST_PARAMETER;
+    },
+    get RETURN_STATEMENT() {
+      return RETURN_STATEMENT;
+    },
+    get SCRIPT() {
+      return SCRIPT;
+    },
+    get SET_ACCESSOR() {
+      return SET_ACCESSOR;
+    },
+    get SPREAD_EXPRESSION() {
+      return SPREAD_EXPRESSION;
+    },
+    get SPREAD_PATTERN_ELEMENT() {
+      return SPREAD_PATTERN_ELEMENT;
+    },
+    get STATE_MACHINE() {
+      return STATE_MACHINE;
+    },
+    get SUPER_EXPRESSION() {
+      return SUPER_EXPRESSION;
+    },
+    get SWITCH_STATEMENT() {
+      return SWITCH_STATEMENT;
+    },
+    get SYNTAX_ERROR_TREE() {
+      return SYNTAX_ERROR_TREE;
+    },
+    get TEMPLATE_LITERAL_EXPRESSION() {
+      return TEMPLATE_LITERAL_EXPRESSION;
+    },
+    get TEMPLATE_LITERAL_PORTION() {
+      return TEMPLATE_LITERAL_PORTION;
+    },
+    get TEMPLATE_SUBSTITUTION() {
+      return TEMPLATE_SUBSTITUTION;
+    },
+    get THIS_EXPRESSION() {
+      return THIS_EXPRESSION;
+    },
+    get THROW_STATEMENT() {
+      return THROW_STATEMENT;
+    },
+    get TRY_STATEMENT() {
+      return TRY_STATEMENT;
+    },
+    get TYPE_NAME() {
+      return TYPE_NAME;
+    },
+    get UNARY_EXPRESSION() {
+      return UNARY_EXPRESSION;
+    },
+    get VARIABLE_DECLARATION() {
+      return VARIABLE_DECLARATION;
+    },
+    get VARIABLE_DECLARATION_LIST() {
+      return VARIABLE_DECLARATION_LIST;
+    },
+    get VARIABLE_STATEMENT() {
+      return VARIABLE_STATEMENT;
+    },
+    get WHILE_STATEMENT() {
+      return WHILE_STATEMENT;
+    },
+    get WITH_STATEMENT() {
+      return WITH_STATEMENT;
+    },
+    get YIELD_EXPRESSION() {
+      return YIELD_EXPRESSION;
+    }
+  };
+});
+System.register("traceur@0.0.32/src/util/JSON", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/util/JSON";
+  function transform(v) {
+    var replacer = arguments[1] !== (void 0) ? arguments[1] : (function(k, v) {
+      return v;
+    });
+    return transform_(replacer('', v), replacer);
+  }
+  function transform_(v, replacer) {
+    var rv,
+        tv;
+    if (Array.isArray(v)) {
+      var len = v.length;
+      rv = Array(len);
+      for (var i = 0; i < len; i++) {
+        tv = transform_(replacer(String(i), v[i]), replacer);
+        rv[i] = tv === undefined ? null : tv;
+      }
+      return rv;
+    }
+    if (v instanceof Object) {
+      rv = {};
+      Object.keys(v).forEach((function(k) {
+        tv = transform_(replacer(k, v[k]), replacer);
+        if (tv !== undefined) {
+          rv[k] = tv;
+        }
+      }));
+      return rv;
+    }
+    return v;
+  }
+  return {get transform() {
+      return transform;
+    }};
+});
+System.register("traceur@0.0.32/src/syntax/trees/ParseTree", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/syntax/trees/ParseTree";
+  var ParseTreeType = System.get("traceur@0.0.32/src/syntax/trees/ParseTreeType");
+  var $__18 = System.get("traceur@0.0.32/src/syntax/TokenType"),
+      STRING = $__18.STRING,
+      VAR = $__18.VAR;
+  var Token = System.get("traceur@0.0.32/src/syntax/Token").Token;
+  var utilJSON = System.get("traceur@0.0.32/src/util/JSON");
+  var $__18 = System.get("traceur@0.0.32/src/syntax/trees/ParseTreeType"),
+      ARGUMENT_LIST = $__18.ARGUMENT_LIST,
+      ARRAY_COMPREHENSION = $__18.ARRAY_COMPREHENSION,
+      ARRAY_LITERAL_EXPRESSION = $__18.ARRAY_LITERAL_EXPRESSION,
+      ARRAY_PATTERN = $__18.ARRAY_PATTERN,
+      ARROW_FUNCTION_EXPRESSION = $__18.ARROW_FUNCTION_EXPRESSION,
+      AWAIT_STATEMENT = $__18.AWAIT_STATEMENT,
+      BINARY_OPERATOR = $__18.BINARY_OPERATOR,
+      BINDING_ELEMENT = $__18.BINDING_ELEMENT,
+      BINDING_IDENTIFIER = $__18.BINDING_IDENTIFIER,
+      BLOCK = $__18.BLOCK,
+      BREAK_STATEMENT = $__18.BREAK_STATEMENT,
+      CALL_EXPRESSION = $__18.CALL_EXPRESSION,
+      CASE_CLAUSE = $__18.CASE_CLAUSE,
+      CATCH = $__18.CATCH,
+      CLASS_DECLARATION = $__18.CLASS_DECLARATION,
+      CLASS_EXPRESSION = $__18.CLASS_EXPRESSION,
+      COMMA_EXPRESSION = $__18.COMMA_EXPRESSION,
+      COMPREHENSION_FOR = $__18.COMPREHENSION_FOR,
+      COMPREHENSION_IF = $__18.COMPREHENSION_IF,
+      COMPUTED_PROPERTY_NAME = $__18.COMPUTED_PROPERTY_NAME,
+      CONDITIONAL_EXPRESSION = $__18.CONDITIONAL_EXPRESSION,
+      CONTINUE_STATEMENT = $__18.CONTINUE_STATEMENT,
+      COVER_FORMALS = $__18.COVER_FORMALS,
+      COVER_INITIALISED_NAME = $__18.COVER_INITIALISED_NAME,
+      DEBUGGER_STATEMENT = $__18.DEBUGGER_STATEMENT,
+      DEFAULT_CLAUSE = $__18.DEFAULT_CLAUSE,
+      DO_WHILE_STATEMENT = $__18.DO_WHILE_STATEMENT,
+      EMPTY_STATEMENT = $__18.EMPTY_STATEMENT,
+      EXPORT_DECLARATION = $__18.EXPORT_DECLARATION,
+      EXPORT_SPECIFIER = $__18.EXPORT_SPECIFIER,
+      EXPORT_SPECIFIER_SET = $__18.EXPORT_SPECIFIER_SET,
+      EXPORT_STAR = $__18.EXPORT_STAR,
+      EXPRESSION_STATEMENT = $__18.EXPRESSION_STATEMENT,
+      FINALLY = $__18.FINALLY,
+      FOR_IN_STATEMENT = $__18.FOR_IN_STATEMENT,
+      FOR_OF_STATEMENT = $__18.FOR_OF_STATEMENT,
+      FOR_STATEMENT = $__18.FOR_STATEMENT,
+      FORMAL_PARAMETER = $__18.FORMAL_PARAMETER,
+      FORMAL_PARAMETER_LIST = $__18.FORMAL_PARAMETER_LIST,
+      FUNCTION_BODY = $__18.FUNCTION_BODY,
+      FUNCTION_DECLARATION = $__18.FUNCTION_DECLARATION,
+      FUNCTION_EXPRESSION = $__18.FUNCTION_EXPRESSION,
+      GENERATOR_COMPREHENSION = $__18.GENERATOR_COMPREHENSION,
+      GET_ACCESSOR = $__18.GET_ACCESSOR,
+      IDENTIFIER_EXPRESSION = $__18.IDENTIFIER_EXPRESSION,
+      IF_STATEMENT = $__18.IF_STATEMENT,
+      IMPORT_DECLARATION = $__18.IMPORT_DECLARATION,
+      IMPORT_SPECIFIER = $__18.IMPORT_SPECIFIER,
+      IMPORT_SPECIFIER_SET = $__18.IMPORT_SPECIFIER_SET,
+      LABELLED_STATEMENT = $__18.LABELLED_STATEMENT,
+      LITERAL_EXPRESSION = $__18.LITERAL_EXPRESSION,
+      LITERAL_PROPERTY_NAME = $__18.LITERAL_PROPERTY_NAME,
+      MEMBER_EXPRESSION = $__18.MEMBER_EXPRESSION,
+      MEMBER_LOOKUP_EXPRESSION = $__18.MEMBER_LOOKUP_EXPRESSION,
+      MODULE = $__18.MODULE,
+      MODULE_DECLARATION = $__18.MODULE_DECLARATION,
+      MODULE_SPECIFIER = $__18.MODULE_SPECIFIER,
+      NAMED_EXPORT = $__18.NAMED_EXPORT,
+      NEW_EXPRESSION = $__18.NEW_EXPRESSION,
+      OBJECT_LITERAL_EXPRESSION = $__18.OBJECT_LITERAL_EXPRESSION,
+      OBJECT_PATTERN = $__18.OBJECT_PATTERN,
+      OBJECT_PATTERN_FIELD = $__18.OBJECT_PATTERN_FIELD,
+      PAREN_EXPRESSION = $__18.PAREN_EXPRESSION,
+      POSTFIX_EXPRESSION = $__18.POSTFIX_EXPRESSION,
+      PREDEFINED_TYPE = $__18.PREDEFINED_TYPE,
+      PROPERTY_METHOD_ASSIGNMENT = $__18.PROPERTY_METHOD_ASSIGNMENT,
+      PROPERTY_NAME_ASSIGNMENT = $__18.PROPERTY_NAME_ASSIGNMENT,
+      PROPERTY_NAME_SHORTHAND = $__18.PROPERTY_NAME_SHORTHAND,
+      REST_PARAMETER = $__18.REST_PARAMETER,
+      RETURN_STATEMENT = $__18.RETURN_STATEMENT,
+      SCRIPT = $__18.SCRIPT,
+      SET_ACCESSOR = $__18.SET_ACCESSOR,
+      SPREAD_EXPRESSION = $__18.SPREAD_EXPRESSION,
+      SPREAD_PATTERN_ELEMENT = $__18.SPREAD_PATTERN_ELEMENT,
+      STATE_MACHINE = $__18.STATE_MACHINE,
+      SUPER_EXPRESSION = $__18.SUPER_EXPRESSION,
+      SWITCH_STATEMENT = $__18.SWITCH_STATEMENT,
+      SYNTAX_ERROR_TREE = $__18.SYNTAX_ERROR_TREE,
+      TEMPLATE_LITERAL_EXPRESSION = $__18.TEMPLATE_LITERAL_EXPRESSION,
+      TEMPLATE_LITERAL_PORTION = $__18.TEMPLATE_LITERAL_PORTION,
+      TEMPLATE_SUBSTITUTION = $__18.TEMPLATE_SUBSTITUTION,
+      THIS_EXPRESSION = $__18.THIS_EXPRESSION,
+      THROW_STATEMENT = $__18.THROW_STATEMENT,
+      TRY_STATEMENT = $__18.TRY_STATEMENT,
+      TYPE_NAME = $__18.TYPE_NAME,
+      UNARY_EXPRESSION = $__18.UNARY_EXPRESSION,
+      VARIABLE_DECLARATION = $__18.VARIABLE_DECLARATION,
+      VARIABLE_DECLARATION_LIST = $__18.VARIABLE_DECLARATION_LIST,
+      VARIABLE_STATEMENT = $__18.VARIABLE_STATEMENT,
+      WHILE_STATEMENT = $__18.WHILE_STATEMENT,
+      WITH_STATEMENT = $__18.WITH_STATEMENT,
+      YIELD_EXPRESSION = $__18.YIELD_EXPRESSION;
+  ;
+  var ParseTree = function ParseTree(type, location) {
+    throw new Error("Don't use for now. 'super' is currently very slow.");
+    this.type = type;
+    this.location = location;
+  };
+  var $ParseTree = ParseTree;
+  ($traceurRuntime.createClass)(ParseTree, {
+    isPattern: function() {
+      switch (this.type) {
+        case ARRAY_PATTERN:
+        case OBJECT_PATTERN:
+          return true;
+        case PAREN_EXPRESSION:
+          return this.expression.isPattern();
+        default:
+          return false;
+      }
+    },
+    isLeftHandSideExpression: function() {
+      switch (this.type) {
+        case THIS_EXPRESSION:
+        case CLASS_EXPRESSION:
+        case SUPER_EXPRESSION:
+        case IDENTIFIER_EXPRESSION:
+        case LITERAL_EXPRESSION:
+        case ARRAY_LITERAL_EXPRESSION:
+        case OBJECT_LITERAL_EXPRESSION:
+        case NEW_EXPRESSION:
+        case MEMBER_EXPRESSION:
+        case MEMBER_LOOKUP_EXPRESSION:
+        case CALL_EXPRESSION:
+        case FUNCTION_EXPRESSION:
+        case TEMPLATE_LITERAL_EXPRESSION:
+          return true;
+        case PAREN_EXPRESSION:
+          return this.expression.isLeftHandSideExpression();
+        default:
+          return false;
+      }
+    },
+    isArrowFunctionExpression: function() {
+      switch (this.type) {
+        case ARRAY_COMPREHENSION:
+        case ARRAY_LITERAL_EXPRESSION:
+        case ARROW_FUNCTION_EXPRESSION:
+        case BINARY_OPERATOR:
+        case CALL_EXPRESSION:
+        case CLASS_EXPRESSION:
+        case CONDITIONAL_EXPRESSION:
+        case FUNCTION_EXPRESSION:
+        case GENERATOR_COMPREHENSION:
+        case IDENTIFIER_EXPRESSION:
+        case LITERAL_EXPRESSION:
+        case MEMBER_EXPRESSION:
+        case MEMBER_LOOKUP_EXPRESSION:
+        case NEW_EXPRESSION:
+        case OBJECT_LITERAL_EXPRESSION:
+        case PAREN_EXPRESSION:
+        case POSTFIX_EXPRESSION:
+        case TEMPLATE_LITERAL_EXPRESSION:
+        case SUPER_EXPRESSION:
+        case THIS_EXPRESSION:
+        case UNARY_EXPRESSION:
+        case YIELD_EXPRESSION:
+          return true;
+        default:
+          return false;
+      }
+    },
+    isMemberExpression: function() {
+      switch (this.type) {
+        case THIS_EXPRESSION:
+        case CLASS_EXPRESSION:
+        case SUPER_EXPRESSION:
+        case IDENTIFIER_EXPRESSION:
+        case LITERAL_EXPRESSION:
+        case ARRAY_LITERAL_EXPRESSION:
+        case OBJECT_LITERAL_EXPRESSION:
+        case PAREN_EXPRESSION:
+        case TEMPLATE_LITERAL_EXPRESSION:
+        case FUNCTION_EXPRESSION:
+        case MEMBER_LOOKUP_EXPRESSION:
+        case MEMBER_EXPRESSION:
+        case CALL_EXPRESSION:
+          return true;
+        case NEW_EXPRESSION:
+          return this.args != null;
+      }
+      return false;
+    },
+    isExpression: function() {
+      return this.isArrowFunctionExpression() || this.type == COMMA_EXPRESSION;
+    },
+    isAssignmentOrSpread: function() {
+      return this.isArrowFunctionExpression() || this.type == SPREAD_EXPRESSION;
+    },
+    isRestParameter: function() {
+      return this.type == REST_PARAMETER || (this.type == FORMAL_PARAMETER && this.parameter.isRestParameter());
+    },
+    isSpreadPatternElement: function() {
+      return this.type == SPREAD_PATTERN_ELEMENT;
+    },
+    isStatementListItem: function() {
+      return this.isStatement() || this.isDeclaration();
+    },
+    isStatement: function() {
+      switch (this.type) {
+        case BLOCK:
+        case VARIABLE_STATEMENT:
+        case EMPTY_STATEMENT:
+        case EXPRESSION_STATEMENT:
+        case IF_STATEMENT:
+        case CONTINUE_STATEMENT:
+        case BREAK_STATEMENT:
+        case RETURN_STATEMENT:
+        case WITH_STATEMENT:
+        case LABELLED_STATEMENT:
+        case THROW_STATEMENT:
+        case TRY_STATEMENT:
+        case DEBUGGER_STATEMENT:
+        case AWAIT_STATEMENT:
+          return true;
+      }
+      return this.isBreakableStatement();
+    },
+    isDeclaration: function() {
+      switch (this.type) {
+        case FUNCTION_DECLARATION:
+        case CLASS_DECLARATION:
+          return true;
+      }
+      return this.isLexicalDeclaration();
+    },
+    isLexicalDeclaration: function() {
+      switch (this.type) {
+        case VARIABLE_STATEMENT:
+          return this.declarations.declarationType !== VAR;
+      }
+      return false;
+    },
+    isBreakableStatement: function() {
+      switch (this.type) {
+        case SWITCH_STATEMENT:
+          return true;
+      }
+      return this.isIterationStatement();
+    },
+    isIterationStatement: function() {
+      switch (this.type) {
+        case DO_WHILE_STATEMENT:
+        case FOR_IN_STATEMENT:
+        case FOR_OF_STATEMENT:
+        case FOR_STATEMENT:
+        case WHILE_STATEMENT:
+          return true;
+      }
+      return false;
+    },
+    isScriptElement: function() {
+      switch (this.type) {
+        case CLASS_DECLARATION:
+        case EXPORT_DECLARATION:
+        case FUNCTION_DECLARATION:
+        case IMPORT_DECLARATION:
+        case MODULE_DECLARATION:
+        case VARIABLE_DECLARATION:
+          return true;
+      }
+      return this.isStatement();
+    },
+    getDirectivePrologueStringToken_: function() {
+      var tree = this;
+      if (tree.type !== EXPRESSION_STATEMENT || !(tree = tree.expression))
+        return null;
+      if (tree.type !== LITERAL_EXPRESSION || !(tree = tree.literalToken))
+        return null;
+      if (tree.type !== STRING)
+        return null;
+      return tree;
+    },
+    isDirectivePrologue: function() {
+      return this.getDirectivePrologueStringToken_() !== null;
+    },
+    isUseStrictDirective: function() {
+      var token = this.getDirectivePrologueStringToken_();
+      if (!token)
+        return false;
+      var v = token.value;
+      return v === '"use strict"' || v === "'use strict'";
+    },
+    toJSON: function() {
+      return utilJSON.transform(this, $ParseTree.replacer);
+    },
+    stringify: function() {
+      var indent = arguments[0] !== (void 0) ? arguments[0] : 2;
+      return JSON.stringify(this, $ParseTree.replacer, indent);
+    }
+  }, {
+    stripLocation: function(key, value) {
+      if (key === 'location') {
+        return undefined;
+      }
+      return value;
+    },
+    replacer: function(k, v) {
+      if (v instanceof $ParseTree || v instanceof Token) {
+        var rv = {type: v.type};
+        Object.keys(v).forEach(function(name) {
+          if (name !== 'location')
+            rv[name] = v[name];
+        });
+        return rv;
+      }
+      return v;
+    }
+  });
+  return {
+    get ParseTreeType() {
+      return ParseTreeType;
+    },
+    get ParseTree() {
+      return ParseTree;
+    }
+  };
+});
+System.register("traceur@0.0.32/src/syntax/trees/ParseTrees", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/syntax/trees/ParseTrees";
+  var ParseTree = System.get("traceur@0.0.32/src/syntax/trees/ParseTree").ParseTree;
+  var ParseTreeType = System.get("traceur@0.0.32/src/syntax/trees/ParseTreeType");
+  var ANNOTATION = ParseTreeType.ANNOTATION;
+  var Annotation = function Annotation(location, name, args) {
+    this.location = location;
+    this.name = name;
+    this.args = args;
+  };
+  ($traceurRuntime.createClass)(Annotation, {
+    transform: function(transformer) {
+      return transformer.transformAnnotation(this);
+    },
+    visit: function(visitor) {
+      visitor.visitAnnotation(this);
+    },
+    get type() {
+      return ANNOTATION;
+    }
+  }, {}, ParseTree);
+  var ANON_BLOCK = ParseTreeType.ANON_BLOCK;
+  var AnonBlock = function AnonBlock(location, statements) {
+    this.location = location;
+    this.statements = statements;
+  };
+  ($traceurRuntime.createClass)(AnonBlock, {
+    transform: function(transformer) {
+      return transformer.transformAnonBlock(this);
+    },
+    visit: function(visitor) {
+      visitor.visitAnonBlock(this);
+    },
+    get type() {
+      return ANON_BLOCK;
+    }
+  }, {}, ParseTree);
+  var ARGUMENT_LIST = ParseTreeType.ARGUMENT_LIST;
+  var ArgumentList = function ArgumentList(location, args) {
+    this.location = location;
+    this.args = args;
+  };
+  ($traceurRuntime.createClass)(ArgumentList, {
+    transform: function(transformer) {
+      return transformer.transformArgumentList(this);
+    },
+    visit: function(visitor) {
+      visitor.visitArgumentList(this);
+    },
+    get type() {
+      return ARGUMENT_LIST;
+    }
+  }, {}, ParseTree);
+  var ARRAY_COMPREHENSION = ParseTreeType.ARRAY_COMPREHENSION;
+  var ArrayComprehension = function ArrayComprehension(location, comprehensionList, expression) {
+    this.location = location;
+    this.comprehensionList = comprehensionList;
+    this.expression = expression;
+  };
+  ($traceurRuntime.createClass)(ArrayComprehension, {
+    transform: function(transformer) {
+      return transformer.transformArrayComprehension(this);
+    },
+    visit: function(visitor) {
+      visitor.visitArrayComprehension(this);
+    },
+    get type() {
+      return ARRAY_COMPREHENSION;
+    }
+  }, {}, ParseTree);
+  var ARRAY_LITERAL_EXPRESSION = ParseTreeType.ARRAY_LITERAL_EXPRESSION;
+  var ArrayLiteralExpression = function ArrayLiteralExpression(location, elements) {
+    this.location = location;
+    this.elements = elements;
+  };
+  ($traceurRuntime.createClass)(ArrayLiteralExpression, {
+    transform: function(transformer) {
+      return transformer.transformArrayLiteralExpression(this);
+    },
+    visit: function(visitor) {
+      visitor.visitArrayLiteralExpression(this);
+    },
+    get type() {
+      return ARRAY_LITERAL_EXPRESSION;
+    }
+  }, {}, ParseTree);
+  var ARRAY_PATTERN = ParseTreeType.ARRAY_PATTERN;
+  var ArrayPattern = function ArrayPattern(location, elements) {
+    this.location = location;
+    this.elements = elements;
+  };
+  ($traceurRuntime.createClass)(ArrayPattern, {
+    transform: function(transformer) {
+      return transformer.transformArrayPattern(this);
+    },
+    visit: function(visitor) {
+      visitor.visitArrayPattern(this);
+    },
+    get type() {
+      return ARRAY_PATTERN;
+    }
+  }, {}, ParseTree);
+  var ARROW_FUNCTION_EXPRESSION = ParseTreeType.ARROW_FUNCTION_EXPRESSION;
+  var ArrowFunctionExpression = function ArrowFunctionExpression(location, formalParameters, functionBody) {
+    this.location = location;
+    this.formalParameters = formalParameters;
+    this.functionBody = functionBody;
+  };
+  ($traceurRuntime.createClass)(ArrowFunctionExpression, {
+    transform: function(transformer) {
+      return transformer.transformArrowFunctionExpression(this);
+    },
+    visit: function(visitor) {
+      visitor.visitArrowFunctionExpression(this);
+    },
+    get type() {
+      return ARROW_FUNCTION_EXPRESSION;
+    }
+  }, {}, ParseTree);
+  var AWAIT_STATEMENT = ParseTreeType.AWAIT_STATEMENT;
+  var AwaitStatement = function AwaitStatement(location, identifier, expression) {
+    this.location = location;
+    this.identifier = identifier;
+    this.expression = expression;
+  };
+  ($traceurRuntime.createClass)(AwaitStatement, {
+    transform: function(transformer) {
+      return transformer.transformAwaitStatement(this);
+    },
+    visit: function(visitor) {
+      visitor.visitAwaitStatement(this);
+    },
+    get type() {
+      return AWAIT_STATEMENT;
+    }
+  }, {}, ParseTree);
+  var BINARY_OPERATOR = ParseTreeType.BINARY_OPERATOR;
+  var BinaryOperator = function BinaryOperator(location, left, operator, right) {
+    this.location = location;
+    this.left = left;
+    this.operator = operator;
+    this.right = right;
+  };
+  ($traceurRuntime.createClass)(BinaryOperator, {
+    transform: function(transformer) {
+      return transformer.transformBinaryOperator(this);
+    },
+    visit: function(visitor) {
+      visitor.visitBinaryOperator(this);
+    },
+    get type() {
+      return BINARY_OPERATOR;
+    }
+  }, {}, ParseTree);
+  var BINDING_ELEMENT = ParseTreeType.BINDING_ELEMENT;
+  var BindingElement = function BindingElement(location, binding, initialiser) {
+    this.location = location;
+    this.binding = binding;
+    this.initialiser = initialiser;
+  };
+  ($traceurRuntime.createClass)(BindingElement, {
+    transform: function(transformer) {
+      return transformer.transformBindingElement(this);
+    },
+    visit: function(visitor) {
+      visitor.visitBindingElement(this);
+    },
+    get type() {
+      return BINDING_ELEMENT;
+    }
+  }, {}, ParseTree);
+  var BINDING_IDENTIFIER = ParseTreeType.BINDING_IDENTIFIER;
+  var BindingIdentifier = function BindingIdentifier(location, identifierToken) {
+    this.location = location;
+    this.identifierToken = identifierToken;
+  };
+  ($traceurRuntime.createClass)(BindingIdentifier, {
+    transform: function(transformer) {
+      return transformer.transformBindingIdentifier(this);
+    },
+    visit: function(visitor) {
+      visitor.visitBindingIdentifier(this);
+    },
+    get type() {
+      return BINDING_IDENTIFIER;
+    }
+  }, {}, ParseTree);
+  var BLOCK = ParseTreeType.BLOCK;
+  var Block = function Block(location, statements) {
+    this.location = location;
+    this.statements = statements;
+  };
+  ($traceurRuntime.createClass)(Block, {
+    transform: function(transformer) {
+      return transformer.transformBlock(this);
+    },
+    visit: function(visitor) {
+      visitor.visitBlock(this);
+    },
+    get type() {
+      return BLOCK;
+    }
+  }, {}, ParseTree);
+  var BREAK_STATEMENT = ParseTreeType.BREAK_STATEMENT;
+  var BreakStatement = function BreakStatement(location, name) {
+    this.location = location;
+    this.name = name;
+  };
+  ($traceurRuntime.createClass)(BreakStatement, {
+    transform: function(transformer) {
+      return transformer.transformBreakStatement(this);
+    },
+    visit: function(visitor) {
+      visitor.visitBreakStatement(this);
+    },
+    get type() {
+      return BREAK_STATEMENT;
+    }
+  }, {}, ParseTree);
+  var CALL_EXPRESSION = ParseTreeType.CALL_EXPRESSION;
+  var CallExpression = function CallExpression(location, operand, args) {
+    this.location = location;
+    this.operand = operand;
+    this.args = args;
+  };
+  ($traceurRuntime.createClass)(CallExpression, {
+    transform: function(transformer) {
+      return transformer.transformCallExpression(this);
+    },
+    visit: function(visitor) {
+      visitor.visitCallExpression(this);
+    },
+    get type() {
+      return CALL_EXPRESSION;
+    }
+  }, {}, ParseTree);
+  var CASE_CLAUSE = ParseTreeType.CASE_CLAUSE;
+  var CaseClause = function CaseClause(location, expression, statements) {
+    this.location = location;
+    this.expression = expression;
+    this.statements = statements;
+  };
+  ($traceurRuntime.createClass)(CaseClause, {
+    transform: function(transformer) {
+      return transformer.transformCaseClause(this);
+    },
+    visit: function(visitor) {
+      visitor.visitCaseClause(this);
+    },
+    get type() {
+      return CASE_CLAUSE;
+    }
+  }, {}, ParseTree);
+  var CATCH = ParseTreeType.CATCH;
+  var Catch = function Catch(location, binding, catchBody) {
+    this.location = location;
+    this.binding = binding;
+    this.catchBody = catchBody;
+  };
+  ($traceurRuntime.createClass)(Catch, {
+    transform: function(transformer) {
+      return transformer.transformCatch(this);
+    },
+    visit: function(visitor) {
+      visitor.visitCatch(this);
+    },
+    get type() {
+      return CATCH;
+    }
+  }, {}, ParseTree);
+  var CLASS_DECLARATION = ParseTreeType.CLASS_DECLARATION;
+  var ClassDeclaration = function ClassDeclaration(location, name, superClass, elements, annotations) {
+    this.location = location;
+    this.name = name;
+    this.superClass = superClass;
+    this.elements = elements;
+    this.annotations = annotations;
+  };
+  ($traceurRuntime.createClass)(ClassDeclaration, {
+    transform: function(transformer) {
+      return transformer.transformClassDeclaration(this);
+    },
+    visit: function(visitor) {
+      visitor.visitClassDeclaration(this);
+    },
+    get type() {
+      return CLASS_DECLARATION;
+    }
+  }, {}, ParseTree);
+  var CLASS_EXPRESSION = ParseTreeType.CLASS_EXPRESSION;
+  var ClassExpression = function ClassExpression(location, name, superClass, elements, annotations) {
+    this.location = location;
+    this.name = name;
+    this.superClass = superClass;
+    this.elements = elements;
+    this.annotations = annotations;
+  };
+  ($traceurRuntime.createClass)(ClassExpression, {
+    transform: function(transformer) {
+      return transformer.transformClassExpression(this);
+    },
+    visit: function(visitor) {
+      visitor.visitClassExpression(this);
+    },
+    get type() {
+      return CLASS_EXPRESSION;
+    }
+  }, {}, ParseTree);
+  var COMMA_EXPRESSION = ParseTreeType.COMMA_EXPRESSION;
+  var CommaExpression = function CommaExpression(location, expressions) {
+    this.location = location;
+    this.expressions = expressions;
+  };
+  ($traceurRuntime.createClass)(CommaExpression, {
+    transform: function(transformer) {
+      return transformer.transformCommaExpression(this);
+    },
+    visit: function(visitor) {
+      visitor.visitCommaExpression(this);
+    },
+    get type() {
+      return COMMA_EXPRESSION;
+    }
+  }, {}, ParseTree);
+  var COMPREHENSION_FOR = ParseTreeType.COMPREHENSION_FOR;
+  var ComprehensionFor = function ComprehensionFor(location, left, iterator) {
+    this.location = location;
+    this.left = left;
+    this.iterator = iterator;
+  };
+  ($traceurRuntime.createClass)(ComprehensionFor, {
+    transform: function(transformer) {
+      return transformer.transformComprehensionFor(this);
+    },
+    visit: function(visitor) {
+      visitor.visitComprehensionFor(this);
+    },
+    get type() {
+      return COMPREHENSION_FOR;
+    }
+  }, {}, ParseTree);
+  var COMPREHENSION_IF = ParseTreeType.COMPREHENSION_IF;
+  var ComprehensionIf = function ComprehensionIf(location, expression) {
+    this.location = location;
+    this.expression = expression;
+  };
+  ($traceurRuntime.createClass)(ComprehensionIf, {
+    transform: function(transformer) {
+      return transformer.transformComprehensionIf(this);
+    },
+    visit: function(visitor) {
+      visitor.visitComprehensionIf(this);
+    },
+    get type() {
+      return COMPREHENSION_IF;
+    }
+  }, {}, ParseTree);
+  var COMPUTED_PROPERTY_NAME = ParseTreeType.COMPUTED_PROPERTY_NAME;
+  var ComputedPropertyName = function ComputedPropertyName(location, expression) {
+    this.location = location;
+    this.expression = expression;
+  };
+  ($traceurRuntime.createClass)(ComputedPropertyName, {
+    transform: function(transformer) {
+      return transformer.transformComputedPropertyName(this);
+    },
+    visit: function(visitor) {
+      visitor.visitComputedPropertyName(this);
+    },
+    get type() {
+      return COMPUTED_PROPERTY_NAME;
+    }
+  }, {}, ParseTree);
+  var CONDITIONAL_EXPRESSION = ParseTreeType.CONDITIONAL_EXPRESSION;
+  var ConditionalExpression = function ConditionalExpression(location, condition, left, right) {
+    this.location = location;
+    this.condition = condition;
+    this.left = left;
+    this.right = right;
+  };
+  ($traceurRuntime.createClass)(ConditionalExpression, {
+    transform: function(transformer) {
+      return transformer.transformConditionalExpression(this);
+    },
+    visit: function(visitor) {
+      visitor.visitConditionalExpression(this);
+    },
+    get type() {
+      return CONDITIONAL_EXPRESSION;
+    }
+  }, {}, ParseTree);
+  var CONTINUE_STATEMENT = ParseTreeType.CONTINUE_STATEMENT;
+  var ContinueStatement = function ContinueStatement(location, name) {
+    this.location = location;
+    this.name = name;
+  };
+  ($traceurRuntime.createClass)(ContinueStatement, {
+    transform: function(transformer) {
+      return transformer.transformContinueStatement(this);
+    },
+    visit: function(visitor) {
+      visitor.visitContinueStatement(this);
+    },
+    get type() {
+      return CONTINUE_STATEMENT;
+    }
+  }, {}, ParseTree);
+  var COVER_FORMALS = ParseTreeType.COVER_FORMALS;
+  var CoverFormals = function CoverFormals(location, expressions) {
+    this.location = location;
+    this.expressions = expressions;
+  };
+  ($traceurRuntime.createClass)(CoverFormals, {
+    transform: function(transformer) {
+      return transformer.transformCoverFormals(this);
+    },
+    visit: function(visitor) {
+      visitor.visitCoverFormals(this);
+    },
+    get type() {
+      return COVER_FORMALS;
+    }
+  }, {}, ParseTree);
+  var COVER_INITIALISED_NAME = ParseTreeType.COVER_INITIALISED_NAME;
+  var CoverInitialisedName = function CoverInitialisedName(location, name, equalToken, initialiser) {
+    this.location = location;
+    this.name = name;
+    this.equalToken = equalToken;
+    this.initialiser = initialiser;
+  };
+  ($traceurRuntime.createClass)(CoverInitialisedName, {
+    transform: function(transformer) {
+      return transformer.transformCoverInitialisedName(this);
+    },
+    visit: function(visitor) {
+      visitor.visitCoverInitialisedName(this);
+    },
+    get type() {
+      return COVER_INITIALISED_NAME;
+    }
+  }, {}, ParseTree);
+  var DEBUGGER_STATEMENT = ParseTreeType.DEBUGGER_STATEMENT;
+  var DebuggerStatement = function DebuggerStatement(location) {
+    this.location = location;
+  };
+  ($traceurRuntime.createClass)(DebuggerStatement, {
+    transform: function(transformer) {
+      return transformer.transformDebuggerStatement(this);
+    },
+    visit: function(visitor) {
+      visitor.visitDebuggerStatement(this);
+    },
+    get type() {
+      return DEBUGGER_STATEMENT;
+    }
+  }, {}, ParseTree);
+  var DEFAULT_CLAUSE = ParseTreeType.DEFAULT_CLAUSE;
+  var DefaultClause = function DefaultClause(location, statements) {
+    this.location = location;
+    this.statements = statements;
+  };
+  ($traceurRuntime.createClass)(DefaultClause, {
+    transform: function(transformer) {
+      return transformer.transformDefaultClause(this);
+    },
+    visit: function(visitor) {
+      visitor.visitDefaultClause(this);
+    },
+    get type() {
+      return DEFAULT_CLAUSE;
+    }
+  }, {}, ParseTree);
+  var DO_WHILE_STATEMENT = ParseTreeType.DO_WHILE_STATEMENT;
+  var DoWhileStatement = function DoWhileStatement(location, body, condition) {
+    this.location = location;
+    this.body = body;
+    this.condition = condition;
+  };
+  ($traceurRuntime.createClass)(DoWhileStatement, {
+    transform: function(transformer) {
+      return transformer.transformDoWhileStatement(this);
+    },
+    visit: function(visitor) {
+      visitor.visitDoWhileStatement(this);
+    },
+    get type() {
+      return DO_WHILE_STATEMENT;
+    }
+  }, {}, ParseTree);
+  var EMPTY_STATEMENT = ParseTreeType.EMPTY_STATEMENT;
+  var EmptyStatement = function EmptyStatement(location) {
+    this.location = location;
+  };
+  ($traceurRuntime.createClass)(EmptyStatement, {
+    transform: function(transformer) {
+      return transformer.transformEmptyStatement(this);
+    },
+    visit: function(visitor) {
+      visitor.visitEmptyStatement(this);
+    },
+    get type() {
+      return EMPTY_STATEMENT;
+    }
+  }, {}, ParseTree);
+  var EXPORT_DECLARATION = ParseTreeType.EXPORT_DECLARATION;
+  var ExportDeclaration = function ExportDeclaration(location, declaration, annotations) {
+    this.location = location;
+    this.declaration = declaration;
+    this.annotations = annotations;
+  };
+  ($traceurRuntime.createClass)(ExportDeclaration, {
+    transform: function(transformer) {
+      return transformer.transformExportDeclaration(this);
+    },
+    visit: function(visitor) {
+      visitor.visitExportDeclaration(this);
+    },
+    get type() {
+      return EXPORT_DECLARATION;
+    }
+  }, {}, ParseTree);
+  var EXPORT_DEFAULT = ParseTreeType.EXPORT_DEFAULT;
+  var ExportDefault = function ExportDefault(location, expression) {
+    this.location = location;
+    this.expression = expression;
+  };
+  ($traceurRuntime.createClass)(ExportDefault, {
+    transform: function(transformer) {
+      return transformer.transformExportDefault(this);
+    },
+    visit: function(visitor) {
+      visitor.visitExportDefault(this);
+    },
+    get type() {
+      return EXPORT_DEFAULT;
+    }
+  }, {}, ParseTree);
+  var EXPORT_SPECIFIER = ParseTreeType.EXPORT_SPECIFIER;
+  var ExportSpecifier = function ExportSpecifier(location, lhs, rhs) {
+    this.location = location;
+    this.lhs = lhs;
+    this.rhs = rhs;
+  };
+  ($traceurRuntime.createClass)(ExportSpecifier, {
+    transform: function(transformer) {
+      return transformer.transformExportSpecifier(this);
+    },
+    visit: function(visitor) {
+      visitor.visitExportSpecifier(this);
+    },
+    get type() {
+      return EXPORT_SPECIFIER;
+    }
+  }, {}, ParseTree);
+  var EXPORT_SPECIFIER_SET = ParseTreeType.EXPORT_SPECIFIER_SET;
+  var ExportSpecifierSet = function ExportSpecifierSet(location, specifiers) {
+    this.location = location;
+    this.specifiers = specifiers;
+  };
+  ($traceurRuntime.createClass)(ExportSpecifierSet, {
+    transform: function(transformer) {
+      return transformer.transformExportSpecifierSet(this);
+    },
+    visit: function(visitor) {
+      visitor.visitExportSpecifierSet(this);
+    },
+    get type() {
+      return EXPORT_SPECIFIER_SET;
+    }
+  }, {}, ParseTree);
+  var EXPORT_STAR = ParseTreeType.EXPORT_STAR;
+  var ExportStar = function ExportStar(location) {
+    this.location = location;
+  };
+  ($traceurRuntime.createClass)(ExportStar, {
+    transform: function(transformer) {
+      return transformer.transformExportStar(this);
+    },
+    visit: function(visitor) {
+      visitor.visitExportStar(this);
+    },
+    get type() {
+      return EXPORT_STAR;
+    }
+  }, {}, ParseTree);
+  var EXPRESSION_STATEMENT = ParseTreeType.EXPRESSION_STATEMENT;
+  var ExpressionStatement = function ExpressionStatement(location, expression) {
+    this.location = location;
+    this.expression = expression;
+  };
+  ($traceurRuntime.createClass)(ExpressionStatement, {
+    transform: function(transformer) {
+      return transformer.transformExpressionStatement(this);
+    },
+    visit: function(visitor) {
+      visitor.visitExpressionStatement(this);
+    },
+    get type() {
+      return EXPRESSION_STATEMENT;
+    }
+  }, {}, ParseTree);
+  var FINALLY = ParseTreeType.FINALLY;
+  var Finally = function Finally(location, block) {
+    this.location = location;
+    this.block = block;
+  };
+  ($traceurRuntime.createClass)(Finally, {
+    transform: function(transformer) {
+      return transformer.transformFinally(this);
+    },
+    visit: function(visitor) {
+      visitor.visitFinally(this);
+    },
+    get type() {
+      return FINALLY;
+    }
+  }, {}, ParseTree);
+  var FOR_IN_STATEMENT = ParseTreeType.FOR_IN_STATEMENT;
+  var ForInStatement = function ForInStatement(location, initialiser, collection, body) {
+    this.location = location;
+    this.initialiser = initialiser;
+    this.collection = collection;
+    this.body = body;
+  };
+  ($traceurRuntime.createClass)(ForInStatement, {
+    transform: function(transformer) {
+      return transformer.transformForInStatement(this);
+    },
+    visit: function(visitor) {
+      visitor.visitForInStatement(this);
+    },
+    get type() {
+      return FOR_IN_STATEMENT;
+    }
+  }, {}, ParseTree);
+  var FOR_OF_STATEMENT = ParseTreeType.FOR_OF_STATEMENT;
+  var ForOfStatement = function ForOfStatement(location, initialiser, collection, body) {
+    this.location = location;
+    this.initialiser = initialiser;
+    this.collection = collection;
+    this.body = body;
+  };
+  ($traceurRuntime.createClass)(ForOfStatement, {
+    transform: function(transformer) {
+      return transformer.transformForOfStatement(this);
+    },
+    visit: function(visitor) {
+      visitor.visitForOfStatement(this);
+    },
+    get type() {
+      return FOR_OF_STATEMENT;
+    }
+  }, {}, ParseTree);
+  var FOR_STATEMENT = ParseTreeType.FOR_STATEMENT;
+  var ForStatement = function ForStatement(location, initialiser, condition, increment, body) {
+    this.location = location;
+    this.initialiser = initialiser;
+    this.condition = condition;
+    this.increment = increment;
+    this.body = body;
+  };
+  ($traceurRuntime.createClass)(ForStatement, {
+    transform: function(transformer) {
+      return transformer.transformForStatement(this);
+    },
+    visit: function(visitor) {
+      visitor.visitForStatement(this);
+    },
+    get type() {
+      return FOR_STATEMENT;
+    }
+  }, {}, ParseTree);
+  var FORMAL_PARAMETER = ParseTreeType.FORMAL_PARAMETER;
+  var FormalParameter = function FormalParameter(location, parameter, typeAnnotation, annotations) {
+    this.location = location;
+    this.parameter = parameter;
+    this.typeAnnotation = typeAnnotation;
+    this.annotations = annotations;
+  };
+  ($traceurRuntime.createClass)(FormalParameter, {
+    transform: function(transformer) {
+      return transformer.transformFormalParameter(this);
+    },
+    visit: function(visitor) {
+      visitor.visitFormalParameter(this);
+    },
+    get type() {
+      return FORMAL_PARAMETER;
+    }
+  }, {}, ParseTree);
+  var FORMAL_PARAMETER_LIST = ParseTreeType.FORMAL_PARAMETER_LIST;
+  var FormalParameterList = function FormalParameterList(location, parameters) {
+    this.location = location;
+    this.parameters = parameters;
+  };
+  ($traceurRuntime.createClass)(FormalParameterList, {
+    transform: function(transformer) {
+      return transformer.transformFormalParameterList(this);
+    },
+    visit: function(visitor) {
+      visitor.visitFormalParameterList(this);
+    },
+    get type() {
+      return FORMAL_PARAMETER_LIST;
+    }
+  }, {}, ParseTree);
+  var FUNCTION_BODY = ParseTreeType.FUNCTION_BODY;
+  var FunctionBody = function FunctionBody(location, statements) {
+    this.location = location;
+    this.statements = statements;
+  };
+  ($traceurRuntime.createClass)(FunctionBody, {
+    transform: function(transformer) {
+      return transformer.transformFunctionBody(this);
+    },
+    visit: function(visitor) {
+      visitor.visitFunctionBody(this);
+    },
+    get type() {
+      return FUNCTION_BODY;
+    }
+  }, {}, ParseTree);
+  var FUNCTION_DECLARATION = ParseTreeType.FUNCTION_DECLARATION;
+  var FunctionDeclaration = function FunctionDeclaration(location, name, isGenerator, formalParameterList, typeAnnotation, annotations, functionBody) {
+    this.location = location;
+    this.name = name;
+    this.isGenerator = isGenerator;
+    this.formalParameterList = formalParameterList;
+    this.typeAnnotation = typeAnnotation;
+    this.annotations = annotations;
+    this.functionBody = functionBody;
+  };
+  ($traceurRuntime.createClass)(FunctionDeclaration, {
+    transform: function(transformer) {
+      return transformer.transformFunctionDeclaration(this);
+    },
+    visit: function(visitor) {
+      visitor.visitFunctionDeclaration(this);
+    },
+    get type() {
+      return FUNCTION_DECLARATION;
+    }
+  }, {}, ParseTree);
+  var FUNCTION_EXPRESSION = ParseTreeType.FUNCTION_EXPRESSION;
+  var FunctionExpression = function FunctionExpression(location, name, isGenerator, formalParameterList, typeAnnotation, annotations, functionBody) {
+    this.location = location;
+    this.name = name;
+    this.isGenerator = isGenerator;
+    this.formalParameterList = formalParameterList;
+    this.typeAnnotation = typeAnnotation;
+    this.annotations = annotations;
+    this.functionBody = functionBody;
+  };
+  ($traceurRuntime.createClass)(FunctionExpression, {
+    transform: function(transformer) {
+      return transformer.transformFunctionExpression(this);
+    },
+    visit: function(visitor) {
+      visitor.visitFunctionExpression(this);
+    },
+    get type() {
+      return FUNCTION_EXPRESSION;
+    }
+  }, {}, ParseTree);
+  var GENERATOR_COMPREHENSION = ParseTreeType.GENERATOR_COMPREHENSION;
+  var GeneratorComprehension = function GeneratorComprehension(location, comprehensionList, expression) {
+    this.location = location;
+    this.comprehensionList = comprehensionList;
+    this.expression = expression;
+  };
+  ($traceurRuntime.createClass)(GeneratorComprehension, {
+    transform: function(transformer) {
+      return transformer.transformGeneratorComprehension(this);
+    },
+    visit: function(visitor) {
+      visitor.visitGeneratorComprehension(this);
+    },
+    get type() {
+      return GENERATOR_COMPREHENSION;
+    }
+  }, {}, ParseTree);
+  var GET_ACCESSOR = ParseTreeType.GET_ACCESSOR;
+  var GetAccessor = function GetAccessor(location, isStatic, name, typeAnnotation, annotations, body) {
+    this.location = location;
+    this.isStatic = isStatic;
+    this.name = name;
+    this.typeAnnotation = typeAnnotation;
+    this.annotations = annotations;
+    this.body = body;
+  };
+  ($traceurRuntime.createClass)(GetAccessor, {
+    transform: function(transformer) {
+      return transformer.transformGetAccessor(this);
+    },
+    visit: function(visitor) {
+      visitor.visitGetAccessor(this);
+    },
+    get type() {
+      return GET_ACCESSOR;
+    }
+  }, {}, ParseTree);
+  var IDENTIFIER_EXPRESSION = ParseTreeType.IDENTIFIER_EXPRESSION;
+  var IdentifierExpression = function IdentifierExpression(location, identifierToken) {
+    this.location = location;
+    this.identifierToken = identifierToken;
+  };
+  ($traceurRuntime.createClass)(IdentifierExpression, {
+    transform: function(transformer) {
+      return transformer.transformIdentifierExpression(this);
+    },
+    visit: function(visitor) {
+      visitor.visitIdentifierExpression(this);
+    },
+    get type() {
+      return IDENTIFIER_EXPRESSION;
+    }
+  }, {}, ParseTree);
+  var IF_STATEMENT = ParseTreeType.IF_STATEMENT;
+  var IfStatement = function IfStatement(location, condition, ifClause, elseClause) {
+    this.location = location;
+    this.condition = condition;
+    this.ifClause = ifClause;
+    this.elseClause = elseClause;
+  };
+  ($traceurRuntime.createClass)(IfStatement, {
+    transform: function(transformer) {
+      return transformer.transformIfStatement(this);
+    },
+    visit: function(visitor) {
+      visitor.visitIfStatement(this);
+    },
+    get type() {
+      return IF_STATEMENT;
+    }
+  }, {}, ParseTree);
+  var IMPORTED_BINDING = ParseTreeType.IMPORTED_BINDING;
+  var ImportedBinding = function ImportedBinding(location, binding) {
+    this.location = location;
+    this.binding = binding;
+  };
+  ($traceurRuntime.createClass)(ImportedBinding, {
+    transform: function(transformer) {
+      return transformer.transformImportedBinding(this);
+    },
+    visit: function(visitor) {
+      visitor.visitImportedBinding(this);
+    },
+    get type() {
+      return IMPORTED_BINDING;
+    }
+  }, {}, ParseTree);
+  var IMPORT_DECLARATION = ParseTreeType.IMPORT_DECLARATION;
+  var ImportDeclaration = function ImportDeclaration(location, importClause, moduleSpecifier) {
+    this.location = location;
+    this.importClause = importClause;
+    this.moduleSpecifier = moduleSpecifier;
+  };
+  ($traceurRuntime.createClass)(ImportDeclaration, {
+    transform: function(transformer) {
+      return transformer.transformImportDeclaration(this);
+    },
+    visit: function(visitor) {
+      visitor.visitImportDeclaration(this);
+    },
+    get type() {
+      return IMPORT_DECLARATION;
+    }
+  }, {}, ParseTree);
+  var IMPORT_SPECIFIER = ParseTreeType.IMPORT_SPECIFIER;
+  var ImportSpecifier = function ImportSpecifier(location, lhs, rhs) {
+    this.location = location;
+    this.lhs = lhs;
+    this.rhs = rhs;
+  };
+  ($traceurRuntime.createClass)(ImportSpecifier, {
+    transform: function(transformer) {
+      return transformer.transformImportSpecifier(this);
+    },
+    visit: function(visitor) {
+      visitor.visitImportSpecifier(this);
+    },
+    get type() {
+      return IMPORT_SPECIFIER;
+    }
+  }, {}, ParseTree);
+  var IMPORT_SPECIFIER_SET = ParseTreeType.IMPORT_SPECIFIER_SET;
+  var ImportSpecifierSet = function ImportSpecifierSet(location, specifiers) {
+    this.location = location;
+    this.specifiers = specifiers;
+  };
+  ($traceurRuntime.createClass)(ImportSpecifierSet, {
+    transform: function(transformer) {
+      return transformer.transformImportSpecifierSet(this);
+    },
+    visit: function(visitor) {
+      visitor.visitImportSpecifierSet(this);
+    },
+    get type() {
+      return IMPORT_SPECIFIER_SET;
+    }
+  }, {}, ParseTree);
+  var LABELLED_STATEMENT = ParseTreeType.LABELLED_STATEMENT;
+  var LabelledStatement = function LabelledStatement(location, name, statement) {
+    this.location = location;
+    this.name = name;
+    this.statement = statement;
+  };
+  ($traceurRuntime.createClass)(LabelledStatement, {
+    transform: function(transformer) {
+      return transformer.transformLabelledStatement(this);
+    },
+    visit: function(visitor) {
+      visitor.visitLabelledStatement(this);
+    },
+    get type() {
+      return LABELLED_STATEMENT;
+    }
+  }, {}, ParseTree);
+  var LITERAL_EXPRESSION = ParseTreeType.LITERAL_EXPRESSION;
+  var LiteralExpression = function LiteralExpression(location, literalToken) {
+    this.location = location;
+    this.literalToken = literalToken;
+  };
+  ($traceurRuntime.createClass)(LiteralExpression, {
+    transform: function(transformer) {
+      return transformer.transformLiteralExpression(this);
+    },
+    visit: function(visitor) {
+      visitor.visitLiteralExpression(this);
+    },
+    get type() {
+      return LITERAL_EXPRESSION;
+    }
+  }, {}, ParseTree);
+  var LITERAL_PROPERTY_NAME = ParseTreeType.LITERAL_PROPERTY_NAME;
+  var LiteralPropertyName = function LiteralPropertyName(location, literalToken) {
+    this.location = location;
+    this.literalToken = literalToken;
+  };
+  ($traceurRuntime.createClass)(LiteralPropertyName, {
+    transform: function(transformer) {
+      return transformer.transformLiteralPropertyName(this);
+    },
+    visit: function(visitor) {
+      visitor.visitLiteralPropertyName(this);
+    },
+    get type() {
+      return LITERAL_PROPERTY_NAME;
+    }
+  }, {}, ParseTree);
+  var MEMBER_EXPRESSION = ParseTreeType.MEMBER_EXPRESSION;
+  var MemberExpression = function MemberExpression(location, operand, memberName) {
+    this.location = location;
+    this.operand = operand;
+    this.memberName = memberName;
+  };
+  ($traceurRuntime.createClass)(MemberExpression, {
+    transform: function(transformer) {
+      return transformer.transformMemberExpression(this);
+    },
+    visit: function(visitor) {
+      visitor.visitMemberExpression(this);
+    },
+    get type() {
+      return MEMBER_EXPRESSION;
+    }
+  }, {}, ParseTree);
+  var MEMBER_LOOKUP_EXPRESSION = ParseTreeType.MEMBER_LOOKUP_EXPRESSION;
+  var MemberLookupExpression = function MemberLookupExpression(location, operand, memberExpression) {
+    this.location = location;
+    this.operand = operand;
+    this.memberExpression = memberExpression;
+  };
+  ($traceurRuntime.createClass)(MemberLookupExpression, {
+    transform: function(transformer) {
+      return transformer.transformMemberLookupExpression(this);
+    },
+    visit: function(visitor) {
+      visitor.visitMemberLookupExpression(this);
+    },
+    get type() {
+      return MEMBER_LOOKUP_EXPRESSION;
+    }
+  }, {}, ParseTree);
+  var MODULE = ParseTreeType.MODULE;
+  var Module = function Module(location, scriptItemList, moduleName) {
+    this.location = location;
+    this.scriptItemList = scriptItemList;
+    this.moduleName = moduleName;
+  };
+  ($traceurRuntime.createClass)(Module, {
+    transform: function(transformer) {
+      return transformer.transformModule(this);
+    },
+    visit: function(visitor) {
+      visitor.visitModule(this);
+    },
+    get type() {
+      return MODULE;
+    }
+  }, {}, ParseTree);
+  var MODULE_DECLARATION = ParseTreeType.MODULE_DECLARATION;
+  var ModuleDeclaration = function ModuleDeclaration(location, identifier, expression) {
+    this.location = location;
+    this.identifier = identifier;
+    this.expression = expression;
+  };
+  ($traceurRuntime.createClass)(ModuleDeclaration, {
+    transform: function(transformer) {
+      return transformer.transformModuleDeclaration(this);
+    },
+    visit: function(visitor) {
+      visitor.visitModuleDeclaration(this);
+    },
+    get type() {
+      return MODULE_DECLARATION;
+    }
+  }, {}, ParseTree);
+  var MODULE_SPECIFIER = ParseTreeType.MODULE_SPECIFIER;
+  var ModuleSpecifier = function ModuleSpecifier(location, token) {
+    this.location = location;
+    this.token = token;
+  };
+  ($traceurRuntime.createClass)(ModuleSpecifier, {
+    transform: function(transformer) {
+      return transformer.transformModuleSpecifier(this);
+    },
+    visit: function(visitor) {
+      visitor.visitModuleSpecifier(this);
+    },
+    get type() {
+      return MODULE_SPECIFIER;
+    }
+  }, {}, ParseTree);
+  var NAMED_EXPORT = ParseTreeType.NAMED_EXPORT;
+  var NamedExport = function NamedExport(location, moduleSpecifier, specifierSet) {
+    this.location = location;
+    this.moduleSpecifier = moduleSpecifier;
+    this.specifierSet = specifierSet;
+  };
+  ($traceurRuntime.createClass)(NamedExport, {
+    transform: function(transformer) {
+      return transformer.transformNamedExport(this);
+    },
+    visit: function(visitor) {
+      visitor.visitNamedExport(this);
+    },
+    get type() {
+      return NAMED_EXPORT;
+    }
+  }, {}, ParseTree);
+  var NEW_EXPRESSION = ParseTreeType.NEW_EXPRESSION;
+  var NewExpression = function NewExpression(location, operand, args) {
+    this.location = location;
+    this.operand = operand;
+    this.args = args;
+  };
+  ($traceurRuntime.createClass)(NewExpression, {
+    transform: function(transformer) {
+      return transformer.transformNewExpression(this);
+    },
+    visit: function(visitor) {
+      visitor.visitNewExpression(this);
+    },
+    get type() {
+      return NEW_EXPRESSION;
+    }
+  }, {}, ParseTree);
+  var OBJECT_LITERAL_EXPRESSION = ParseTreeType.OBJECT_LITERAL_EXPRESSION;
+  var ObjectLiteralExpression = function ObjectLiteralExpression(location, propertyNameAndValues) {
+    this.location = location;
+    this.propertyNameAndValues = propertyNameAndValues;
+  };
+  ($traceurRuntime.createClass)(ObjectLiteralExpression, {
+    transform: function(transformer) {
+      return transformer.transformObjectLiteralExpression(this);
+    },
+    visit: function(visitor) {
+      visitor.visitObjectLiteralExpression(this);
+    },
+    get type() {
+      return OBJECT_LITERAL_EXPRESSION;
+    }
+  }, {}, ParseTree);
+  var OBJECT_PATTERN = ParseTreeType.OBJECT_PATTERN;
+  var ObjectPattern = function ObjectPattern(location, fields) {
+    this.location = location;
+    this.fields = fields;
+  };
+  ($traceurRuntime.createClass)(ObjectPattern, {
+    transform: function(transformer) {
+      return transformer.transformObjectPattern(this);
+    },
+    visit: function(visitor) {
+      visitor.visitObjectPattern(this);
+    },
+    get type() {
+      return OBJECT_PATTERN;
+    }
+  }, {}, ParseTree);
+  var OBJECT_PATTERN_FIELD = ParseTreeType.OBJECT_PATTERN_FIELD;
+  var ObjectPatternField = function ObjectPatternField(location, name, element) {
+    this.location = location;
+    this.name = name;
+    this.element = element;
+  };
+  ($traceurRuntime.createClass)(ObjectPatternField, {
+    transform: function(transformer) {
+      return transformer.transformObjectPatternField(this);
+    },
+    visit: function(visitor) {
+      visitor.visitObjectPatternField(this);
+    },
+    get type() {
+      return OBJECT_PATTERN_FIELD;
+    }
+  }, {}, ParseTree);
+  var PAREN_EXPRESSION = ParseTreeType.PAREN_EXPRESSION;
+  var ParenExpression = function ParenExpression(location, expression) {
+    this.location = location;
+    this.expression = expression;
+  };
+  ($traceurRuntime.createClass)(ParenExpression, {
+    transform: function(transformer) {
+      return transformer.transformParenExpression(this);
+    },
+    visit: function(visitor) {
+      visitor.visitParenExpression(this);
+    },
+    get type() {
+      return PAREN_EXPRESSION;
+    }
+  }, {}, ParseTree);
+  var POSTFIX_EXPRESSION = ParseTreeType.POSTFIX_EXPRESSION;
+  var PostfixExpression = function PostfixExpression(location, operand, operator) {
+    this.location = location;
+    this.operand = operand;
+    this.operator = operator;
+  };
+  ($traceurRuntime.createClass)(PostfixExpression, {
+    transform: function(transformer) {
+      return transformer.transformPostfixExpression(this);
+    },
+    visit: function(visitor) {
+      visitor.visitPostfixExpression(this);
+    },
+    get type() {
+      return POSTFIX_EXPRESSION;
+    }
+  }, {}, ParseTree);
+  var PREDEFINED_TYPE = ParseTreeType.PREDEFINED_TYPE;
+  var PredefinedType = function PredefinedType(location, typeToken) {
+    this.location = location;
+    this.typeToken = typeToken;
+  };
+  ($traceurRuntime.createClass)(PredefinedType, {
+    transform: function(transformer) {
+      return transformer.transformPredefinedType(this);
+    },
+    visit: function(visitor) {
+      visitor.visitPredefinedType(this);
+    },
+    get type() {
+      return PREDEFINED_TYPE;
+    }
+  }, {}, ParseTree);
+  var SCRIPT = ParseTreeType.SCRIPT;
+  var Script = function Script(location, scriptItemList, moduleName) {
+    this.location = location;
+    this.scriptItemList = scriptItemList;
+    this.moduleName = moduleName;
+  };
+  ($traceurRuntime.createClass)(Script, {
+    transform: function(transformer) {
+      return transformer.transformScript(this);
+    },
+    visit: function(visitor) {
+      visitor.visitScript(this);
+    },
+    get type() {
+      return SCRIPT;
+    }
+  }, {}, ParseTree);
+  var PROPERTY_METHOD_ASSIGNMENT = ParseTreeType.PROPERTY_METHOD_ASSIGNMENT;
+  var PropertyMethodAssignment = function PropertyMethodAssignment(location, isStatic, isGenerator, name, formalParameterList, typeAnnotation, annotations, functionBody) {
+    this.location = location;
+    this.isStatic = isStatic;
+    this.isGenerator = isGenerator;
+    this.name = name;
+    this.formalParameterList = formalParameterList;
+    this.typeAnnotation = typeAnnotation;
+    this.annotations = annotations;
+    this.functionBody = functionBody;
+  };
+  ($traceurRuntime.createClass)(PropertyMethodAssignment, {
+    transform: function(transformer) {
+      return transformer.transformPropertyMethodAssignment(this);
+    },
+    visit: function(visitor) {
+      visitor.visitPropertyMethodAssignment(this);
+    },
+    get type() {
+      return PROPERTY_METHOD_ASSIGNMENT;
+    }
+  }, {}, ParseTree);
+  var PROPERTY_NAME_ASSIGNMENT = ParseTreeType.PROPERTY_NAME_ASSIGNMENT;
+  var PropertyNameAssignment = function PropertyNameAssignment(location, name, value) {
+    this.location = location;
+    this.name = name;
+    this.value = value;
+  };
+  ($traceurRuntime.createClass)(PropertyNameAssignment, {
+    transform: function(transformer) {
+      return transformer.transformPropertyNameAssignment(this);
+    },
+    visit: function(visitor) {
+      visitor.visitPropertyNameAssignment(this);
+    },
+    get type() {
+      return PROPERTY_NAME_ASSIGNMENT;
+    }
+  }, {}, ParseTree);
+  var PROPERTY_NAME_SHORTHAND = ParseTreeType.PROPERTY_NAME_SHORTHAND;
+  var PropertyNameShorthand = function PropertyNameShorthand(location, name) {
+    this.location = location;
+    this.name = name;
+  };
+  ($traceurRuntime.createClass)(PropertyNameShorthand, {
+    transform: function(transformer) {
+      return transformer.transformPropertyNameShorthand(this);
+    },
+    visit: function(visitor) {
+      visitor.visitPropertyNameShorthand(this);
+    },
+    get type() {
+      return PROPERTY_NAME_SHORTHAND;
+    }
+  }, {}, ParseTree);
+  var REST_PARAMETER = ParseTreeType.REST_PARAMETER;
+  var RestParameter = function RestParameter(location, identifier) {
+    this.location = location;
+    this.identifier = identifier;
+  };
+  ($traceurRuntime.createClass)(RestParameter, {
+    transform: function(transformer) {
+      return transformer.transformRestParameter(this);
+    },
+    visit: function(visitor) {
+      visitor.visitRestParameter(this);
+    },
+    get type() {
+      return REST_PARAMETER;
+    }
+  }, {}, ParseTree);
+  var RETURN_STATEMENT = ParseTreeType.RETURN_STATEMENT;
+  var ReturnStatement = function ReturnStatement(location, expression) {
+    this.location = location;
+    this.expression = expression;
+  };
+  ($traceurRuntime.createClass)(ReturnStatement, {
+    transform: function(transformer) {
+      return transformer.transformReturnStatement(this);
+    },
+    visit: function(visitor) {
+      visitor.visitReturnStatement(this);
+    },
+    get type() {
+      return RETURN_STATEMENT;
+    }
+  }, {}, ParseTree);
+  var SET_ACCESSOR = ParseTreeType.SET_ACCESSOR;
+  var SetAccessor = function SetAccessor(location, isStatic, name, parameter, annotations, body) {
+    this.location = location;
+    this.isStatic = isStatic;
+    this.name = name;
+    this.parameter = parameter;
+    this.annotations = annotations;
+    this.body = body;
+  };
+  ($traceurRuntime.createClass)(SetAccessor, {
+    transform: function(transformer) {
+      return transformer.transformSetAccessor(this);
+    },
+    visit: function(visitor) {
+      visitor.visitSetAccessor(this);
+    },
+    get type() {
+      return SET_ACCESSOR;
+    }
+  }, {}, ParseTree);
+  var SPREAD_EXPRESSION = ParseTreeType.SPREAD_EXPRESSION;
+  var SpreadExpression = function SpreadExpression(location, expression) {
+    this.location = location;
+    this.expression = expression;
+  };
+  ($traceurRuntime.createClass)(SpreadExpression, {
+    transform: function(transformer) {
+      return transformer.transformSpreadExpression(this);
+    },
+    visit: function(visitor) {
+      visitor.visitSpreadExpression(this);
+    },
+    get type() {
+      return SPREAD_EXPRESSION;
+    }
+  }, {}, ParseTree);
+  var SPREAD_PATTERN_ELEMENT = ParseTreeType.SPREAD_PATTERN_ELEMENT;
+  var SpreadPatternElement = function SpreadPatternElement(location, lvalue) {
+    this.location = location;
+    this.lvalue = lvalue;
+  };
+  ($traceurRuntime.createClass)(SpreadPatternElement, {
+    transform: function(transformer) {
+      return transformer.transformSpreadPatternElement(this);
+    },
+    visit: function(visitor) {
+      visitor.visitSpreadPatternElement(this);
+    },
+    get type() {
+      return SPREAD_PATTERN_ELEMENT;
+    }
+  }, {}, ParseTree);
+  var SUPER_EXPRESSION = ParseTreeType.SUPER_EXPRESSION;
+  var SuperExpression = function SuperExpression(location) {
+    this.location = location;
+  };
+  ($traceurRuntime.createClass)(SuperExpression, {
+    transform: function(transformer) {
+      return transformer.transformSuperExpression(this);
+    },
+    visit: function(visitor) {
+      visitor.visitSuperExpression(this);
+    },
+    get type() {
+      return SUPER_EXPRESSION;
+    }
+  }, {}, ParseTree);
+  var SWITCH_STATEMENT = ParseTreeType.SWITCH_STATEMENT;
+  var SwitchStatement = function SwitchStatement(location, expression, caseClauses) {
+    this.location = location;
+    this.expression = expression;
+    this.caseClauses = caseClauses;
+  };
+  ($traceurRuntime.createClass)(SwitchStatement, {
+    transform: function(transformer) {
+      return transformer.transformSwitchStatement(this);
+    },
+    visit: function(visitor) {
+      visitor.visitSwitchStatement(this);
+    },
+    get type() {
+      return SWITCH_STATEMENT;
+    }
+  }, {}, ParseTree);
+  var SYNTAX_ERROR_TREE = ParseTreeType.SYNTAX_ERROR_TREE;
+  var SyntaxErrorTree = function SyntaxErrorTree(location, nextToken, message) {
+    this.location = location;
+    this.nextToken = nextToken;
+    this.message = message;
+  };
+  ($traceurRuntime.createClass)(SyntaxErrorTree, {
+    transform: function(transformer) {
+      return transformer.transformSyntaxErrorTree(this);
+    },
+    visit: function(visitor) {
+      visitor.visitSyntaxErrorTree(this);
+    },
+    get type() {
+      return SYNTAX_ERROR_TREE;
+    }
+  }, {}, ParseTree);
+  var TEMPLATE_LITERAL_EXPRESSION = ParseTreeType.TEMPLATE_LITERAL_EXPRESSION;
+  var TemplateLiteralExpression = function TemplateLiteralExpression(location, operand, elements) {
+    this.location = location;
+    this.operand = operand;
+    this.elements = elements;
+  };
+  ($traceurRuntime.createClass)(TemplateLiteralExpression, {
+    transform: function(transformer) {
+      return transformer.transformTemplateLiteralExpression(this);
+    },
+    visit: function(visitor) {
+      visitor.visitTemplateLiteralExpression(this);
+    },
+    get type() {
+      return TEMPLATE_LITERAL_EXPRESSION;
+    }
+  }, {}, ParseTree);
+  var TEMPLATE_LITERAL_PORTION = ParseTreeType.TEMPLATE_LITERAL_PORTION;
+  var TemplateLiteralPortion = function TemplateLiteralPortion(location, value) {
+    this.location = location;
+    this.value = value;
+  };
+  ($traceurRuntime.createClass)(TemplateLiteralPortion, {
+    transform: function(transformer) {
+      return transformer.transformTemplateLiteralPortion(this);
+    },
+    visit: function(visitor) {
+      visitor.visitTemplateLiteralPortion(this);
+    },
+    get type() {
+      return TEMPLATE_LITERAL_PORTION;
+    }
+  }, {}, ParseTree);
+  var TEMPLATE_SUBSTITUTION = ParseTreeType.TEMPLATE_SUBSTITUTION;
+  var TemplateSubstitution = function TemplateSubstitution(location, expression) {
+    this.location = location;
+    this.expression = expression;
+  };
+  ($traceurRuntime.createClass)(TemplateSubstitution, {
+    transform: function(transformer) {
+      return transformer.transformTemplateSubstitution(this);
+    },
+    visit: function(visitor) {
+      visitor.visitTemplateSubstitution(this);
+    },
+    get type() {
+      return TEMPLATE_SUBSTITUTION;
+    }
+  }, {}, ParseTree);
+  var THIS_EXPRESSION = ParseTreeType.THIS_EXPRESSION;
+  var ThisExpression = function ThisExpression(location) {
+    this.location = location;
+  };
+  ($traceurRuntime.createClass)(ThisExpression, {
+    transform: function(transformer) {
+      return transformer.transformThisExpression(this);
+    },
+    visit: function(visitor) {
+      visitor.visitThisExpression(this);
+    },
+    get type() {
+      return THIS_EXPRESSION;
+    }
+  }, {}, ParseTree);
+  var THROW_STATEMENT = ParseTreeType.THROW_STATEMENT;
+  var ThrowStatement = function ThrowStatement(location, value) {
+    this.location = location;
+    this.value = value;
+  };
+  ($traceurRuntime.createClass)(ThrowStatement, {
+    transform: function(transformer) {
+      return transformer.transformThrowStatement(this);
+    },
+    visit: function(visitor) {
+      visitor.visitThrowStatement(this);
+    },
+    get type() {
+      return THROW_STATEMENT;
+    }
+  }, {}, ParseTree);
+  var TRY_STATEMENT = ParseTreeType.TRY_STATEMENT;
+  var TryStatement = function TryStatement(location, body, catchBlock, finallyBlock) {
+    this.location = location;
+    this.body = body;
+    this.catchBlock = catchBlock;
+    this.finallyBlock = finallyBlock;
+  };
+  ($traceurRuntime.createClass)(TryStatement, {
+    transform: function(transformer) {
+      return transformer.transformTryStatement(this);
+    },
+    visit: function(visitor) {
+      visitor.visitTryStatement(this);
+    },
+    get type() {
+      return TRY_STATEMENT;
+    }
+  }, {}, ParseTree);
+  var TYPE_NAME = ParseTreeType.TYPE_NAME;
+  var TypeName = function TypeName(location, moduleName, name) {
+    this.location = location;
+    this.moduleName = moduleName;
+    this.name = name;
+  };
+  ($traceurRuntime.createClass)(TypeName, {
+    transform: function(transformer) {
+      return transformer.transformTypeName(this);
+    },
+    visit: function(visitor) {
+      visitor.visitTypeName(this);
+    },
+    get type() {
+      return TYPE_NAME;
+    }
+  }, {}, ParseTree);
+  var UNARY_EXPRESSION = ParseTreeType.UNARY_EXPRESSION;
+  var UnaryExpression = function UnaryExpression(location, operator, operand) {
+    this.location = location;
+    this.operator = operator;
+    this.operand = operand;
+  };
+  ($traceurRuntime.createClass)(UnaryExpression, {
+    transform: function(transformer) {
+      return transformer.transformUnaryExpression(this);
+    },
+    visit: function(visitor) {
+      visitor.visitUnaryExpression(this);
+    },
+    get type() {
+      return UNARY_EXPRESSION;
+    }
+  }, {}, ParseTree);
+  var VARIABLE_DECLARATION = ParseTreeType.VARIABLE_DECLARATION;
+  var VariableDeclaration = function VariableDeclaration(location, lvalue, typeAnnotation, initialiser) {
+    this.location = location;
+    this.lvalue = lvalue;
+    this.typeAnnotation = typeAnnotation;
+    this.initialiser = initialiser;
+  };
+  ($traceurRuntime.createClass)(VariableDeclaration, {
+    transform: function(transformer) {
+      return transformer.transformVariableDeclaration(this);
+    },
+    visit: function(visitor) {
+      visitor.visitVariableDeclaration(this);
+    },
+    get type() {
+      return VARIABLE_DECLARATION;
+    }
+  }, {}, ParseTree);
+  var VARIABLE_DECLARATION_LIST = ParseTreeType.VARIABLE_DECLARATION_LIST;
+  var VariableDeclarationList = function VariableDeclarationList(location, declarationType, declarations) {
+    this.location = location;
+    this.declarationType = declarationType;
+    this.declarations = declarations;
+  };
+  ($traceurRuntime.createClass)(VariableDeclarationList, {
+    transform: function(transformer) {
+      return transformer.transformVariableDeclarationList(this);
+    },
+    visit: function(visitor) {
+      visitor.visitVariableDeclarationList(this);
+    },
+    get type() {
+      return VARIABLE_DECLARATION_LIST;
+    }
+  }, {}, ParseTree);
+  var VARIABLE_STATEMENT = ParseTreeType.VARIABLE_STATEMENT;
+  var VariableStatement = function VariableStatement(location, declarations) {
+    this.location = location;
+    this.declarations = declarations;
+  };
+  ($traceurRuntime.createClass)(VariableStatement, {
+    transform: function(transformer) {
+      return transformer.transformVariableStatement(this);
+    },
+    visit: function(visitor) {
+      visitor.visitVariableStatement(this);
+    },
+    get type() {
+      return VARIABLE_STATEMENT;
+    }
+  }, {}, ParseTree);
+  var WHILE_STATEMENT = ParseTreeType.WHILE_STATEMENT;
+  var WhileStatement = function WhileStatement(location, condition, body) {
+    this.location = location;
+    this.condition = condition;
+    this.body = body;
+  };
+  ($traceurRuntime.createClass)(WhileStatement, {
+    transform: function(transformer) {
+      return transformer.transformWhileStatement(this);
+    },
+    visit: function(visitor) {
+      visitor.visitWhileStatement(this);
+    },
+    get type() {
+      return WHILE_STATEMENT;
+    }
+  }, {}, ParseTree);
+  var WITH_STATEMENT = ParseTreeType.WITH_STATEMENT;
+  var WithStatement = function WithStatement(location, expression, body) {
+    this.location = location;
+    this.expression = expression;
+    this.body = body;
+  };
+  ($traceurRuntime.createClass)(WithStatement, {
+    transform: function(transformer) {
+      return transformer.transformWithStatement(this);
+    },
+    visit: function(visitor) {
+      visitor.visitWithStatement(this);
+    },
+    get type() {
+      return WITH_STATEMENT;
+    }
+  }, {}, ParseTree);
+  var YIELD_EXPRESSION = ParseTreeType.YIELD_EXPRESSION;
+  var YieldExpression = function YieldExpression(location, expression, isYieldFor) {
+    this.location = location;
+    this.expression = expression;
+    this.isYieldFor = isYieldFor;
+  };
+  ($traceurRuntime.createClass)(YieldExpression, {
+    transform: function(transformer) {
+      return transformer.transformYieldExpression(this);
+    },
+    visit: function(visitor) {
+      visitor.visitYieldExpression(this);
+    },
+    get type() {
+      return YIELD_EXPRESSION;
+    }
+  }, {}, ParseTree);
+  return {
+    get Annotation() {
+      return Annotation;
+    },
+    get AnonBlock() {
+      return AnonBlock;
+    },
+    get ArgumentList() {
+      return ArgumentList;
+    },
+    get ArrayComprehension() {
+      return ArrayComprehension;
+    },
+    get ArrayLiteralExpression() {
+      return ArrayLiteralExpression;
+    },
+    get ArrayPattern() {
+      return ArrayPattern;
+    },
+    get ArrowFunctionExpression() {
+      return ArrowFunctionExpression;
+    },
+    get AwaitStatement() {
+      return AwaitStatement;
+    },
+    get BinaryOperator() {
+      return BinaryOperator;
+    },
+    get BindingElement() {
+      return BindingElement;
+    },
+    get BindingIdentifier() {
+      return BindingIdentifier;
+    },
+    get Block() {
+      return Block;
+    },
+    get BreakStatement() {
+      return BreakStatement;
+    },
+    get CallExpression() {
+      return CallExpression;
+    },
+    get CaseClause() {
+      return CaseClause;
+    },
+    get Catch() {
+      return Catch;
+    },
+    get ClassDeclaration() {
+      return ClassDeclaration;
+    },
+    get ClassExpression() {
+      return ClassExpression;
+    },
+    get CommaExpression() {
+      return CommaExpression;
+    },
+    get ComprehensionFor() {
+      return ComprehensionFor;
+    },
+    get ComprehensionIf() {
+      return ComprehensionIf;
+    },
+    get ComputedPropertyName() {
+      return ComputedPropertyName;
+    },
+    get ConditionalExpression() {
+      return ConditionalExpression;
+    },
+    get ContinueStatement() {
+      return ContinueStatement;
+    },
+    get CoverFormals() {
+      return CoverFormals;
+    },
+    get CoverInitialisedName() {
+      return CoverInitialisedName;
+    },
+    get DebuggerStatement() {
+      return DebuggerStatement;
+    },
+    get DefaultClause() {
+      return DefaultClause;
+    },
+    get DoWhileStatement() {
+      return DoWhileStatement;
+    },
+    get EmptyStatement() {
+      return EmptyStatement;
+    },
+    get ExportDeclaration() {
+      return ExportDeclaration;
+    },
+    get ExportDefault() {
+      return ExportDefault;
+    },
+    get ExportSpecifier() {
+      return ExportSpecifier;
+    },
+    get ExportSpecifierSet() {
+      return ExportSpecifierSet;
+    },
+    get ExportStar() {
+      return ExportStar;
+    },
+    get ExpressionStatement() {
+      return ExpressionStatement;
+    },
+    get Finally() {
+      return Finally;
+    },
+    get ForInStatement() {
+      return ForInStatement;
+    },
+    get ForOfStatement() {
+      return ForOfStatement;
+    },
+    get ForStatement() {
+      return ForStatement;
+    },
+    get FormalParameter() {
+      return FormalParameter;
+    },
+    get FormalParameterList() {
+      return FormalParameterList;
+    },
+    get FunctionBody() {
+      return FunctionBody;
+    },
+    get FunctionDeclaration() {
+      return FunctionDeclaration;
+    },
+    get FunctionExpression() {
+      return FunctionExpression;
+    },
+    get GeneratorComprehension() {
+      return GeneratorComprehension;
+    },
+    get GetAccessor() {
+      return GetAccessor;
+    },
+    get IdentifierExpression() {
+      return IdentifierExpression;
+    },
+    get IfStatement() {
+      return IfStatement;
+    },
+    get ImportedBinding() {
+      return ImportedBinding;
+    },
+    get ImportDeclaration() {
+      return ImportDeclaration;
+    },
+    get ImportSpecifier() {
+      return ImportSpecifier;
+    },
+    get ImportSpecifierSet() {
+      return ImportSpecifierSet;
+    },
+    get LabelledStatement() {
+      return LabelledStatement;
+    },
+    get LiteralExpression() {
+      return LiteralExpression;
+    },
+    get LiteralPropertyName() {
+      return LiteralPropertyName;
+    },
+    get MemberExpression() {
+      return MemberExpression;
+    },
+    get MemberLookupExpression() {
+      return MemberLookupExpression;
+    },
+    get Module() {
+      return Module;
+    },
+    get ModuleDeclaration() {
+      return ModuleDeclaration;
+    },
+    get ModuleSpecifier() {
+      return ModuleSpecifier;
+    },
+    get NamedExport() {
+      return NamedExport;
+    },
+    get NewExpression() {
+      return NewExpression;
+    },
+    get ObjectLiteralExpression() {
+      return ObjectLiteralExpression;
+    },
+    get ObjectPattern() {
+      return ObjectPattern;
+    },
+    get ObjectPatternField() {
+      return ObjectPatternField;
+    },
+    get ParenExpression() {
+      return ParenExpression;
+    },
+    get PostfixExpression() {
+      return PostfixExpression;
+    },
+    get PredefinedType() {
+      return PredefinedType;
+    },
+    get Script() {
+      return Script;
+    },
+    get PropertyMethodAssignment() {
+      return PropertyMethodAssignment;
+    },
+    get PropertyNameAssignment() {
+      return PropertyNameAssignment;
+    },
+    get PropertyNameShorthand() {
+      return PropertyNameShorthand;
+    },
+    get RestParameter() {
+      return RestParameter;
+    },
+    get ReturnStatement() {
+      return ReturnStatement;
+    },
+    get SetAccessor() {
+      return SetAccessor;
+    },
+    get SpreadExpression() {
+      return SpreadExpression;
+    },
+    get SpreadPatternElement() {
+      return SpreadPatternElement;
+    },
+    get SuperExpression() {
+      return SuperExpression;
+    },
+    get SwitchStatement() {
+      return SwitchStatement;
+    },
+    get SyntaxErrorTree() {
+      return SyntaxErrorTree;
+    },
+    get TemplateLiteralExpression() {
+      return TemplateLiteralExpression;
+    },
+    get TemplateLiteralPortion() {
+      return TemplateLiteralPortion;
+    },
+    get TemplateSubstitution() {
+      return TemplateSubstitution;
+    },
+    get ThisExpression() {
+      return ThisExpression;
+    },
+    get ThrowStatement() {
+      return ThrowStatement;
+    },
+    get TryStatement() {
+      return TryStatement;
+    },
+    get TypeName() {
+      return TypeName;
+    },
+    get UnaryExpression() {
+      return UnaryExpression;
+    },
+    get VariableDeclaration() {
+      return VariableDeclaration;
+    },
+    get VariableDeclarationList() {
+      return VariableDeclarationList;
+    },
+    get VariableStatement() {
+      return VariableStatement;
+    },
+    get WhileStatement() {
+      return WhileStatement;
+    },
+    get WithStatement() {
+      return WithStatement;
+    },
+    get YieldExpression() {
+      return YieldExpression;
+    }
+  };
+});
+System.register("traceur@0.0.32/src/semantics/FreeVariableChecker", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/semantics/FreeVariableChecker";
+  var ARGUMENTS = System.get("traceur@0.0.32/src/syntax/PredefinedName").ARGUMENTS;
+  var $__23 = System.get("traceur@0.0.32/src/syntax/trees/ParseTrees"),
+      BindingIdentifier = $__23.BindingIdentifier,
+      IdentifierExpression = $__23.IdentifierExpression;
+  var IdentifierToken = System.get("traceur@0.0.32/src/syntax/IdentifierToken").IdentifierToken;
+  var IDENTIFIER_EXPRESSION = System.get("traceur@0.0.32/src/syntax/trees/ParseTreeType").IDENTIFIER_EXPRESSION;
+  var ParseTreeVisitor = System.get("traceur@0.0.32/src/syntax/ParseTreeVisitor").ParseTreeVisitor;
+  var TYPEOF = System.get("traceur@0.0.32/src/syntax/TokenType").TYPEOF;
+  var global = this;
+  var Scope = function Scope(parent) {
+    this.parent = parent;
+    this.references = Object.create(null);
+    this.declarations = Object.create(null);
+  };
+  ($traceurRuntime.createClass)(Scope, {}, {});
+  function getVariableName(name) {
+    if (name instanceof IdentifierExpression) {
+      name = name.identifierToken;
+    } else if (name instanceof BindingIdentifier) {
+      name = name.identifierToken;
+    }
+    if (name instanceof IdentifierToken) {
+      name = name.value;
+    }
+    return name;
+  }
+  var FreeVariableChecker = function FreeVariableChecker(reporter) {
+    $traceurRuntime.superCall(this, $FreeVariableChecker.prototype, "constructor", []);
+    this.reporter_ = reporter;
+    this.scope_ = null;
+    this.disableChecksLevel_ = 0;
+  };
+  var $FreeVariableChecker = FreeVariableChecker;
+  ($traceurRuntime.createClass)(FreeVariableChecker, {
+    pushScope_: function() {
+      return this.scope_ = new Scope(this.scope_);
+    },
+    pop_: function(scope) {
+      if (this.scope_ != scope) {
+        throw new Error('FreeVariableChecker scope mismatch');
+      }
+      this.validateScope_();
+      this.scope_ = scope.parent;
+    },
+    visitScript: function(tree, global) {
+      var scope = this.pushScope_();
+      var object = global;
+      while (object) {
+        Object.getOwnPropertyNames(object).forEach(this.declareVariable_, this);
+        object = Object.getPrototypeOf(object);
+      }
+      this.visitList(tree.scriptItemList);
+      this.pop_(scope);
+    },
+    visitFunction_: function(name, formalParameterList, body) {
+      var scope = this.pushScope_();
+      this.visitAny(name);
+      this.declareVariable_(ARGUMENTS);
+      this.visitAny(formalParameterList);
+      this.visitAny(body);
+      this.pop_(scope);
+    },
+    visitFunctionDeclaration: function(tree) {
+      this.declareVariable_(tree.name);
+      this.visitFunction_(null, tree.formalParameterList, tree.functionBody);
+    },
+    visitFunctionExpression: function(tree) {
+      this.visitFunction_(tree.name, tree.formalParameterList, tree.functionBody);
+    },
+    visitArrowFunctionExpression: function(tree) {
+      this.visitFunction_(null, tree.formalParameters, tree.functionBody);
+    },
+    visitGetAccessor: function(tree) {
+      var scope = this.pushScope_();
+      $traceurRuntime.superCall(this, $FreeVariableChecker.prototype, "visitGetAccessor", [tree]);
+      this.pop_(scope);
+    },
+    visitSetAccessor: function(tree) {
+      var scope = this.pushScope_();
+      $traceurRuntime.superCall(this, $FreeVariableChecker.prototype, "visitSetAccessor", [tree]);
+      this.pop_(scope);
+    },
+    visitCatch: function(tree) {
+      var scope = this.pushScope_();
+      $traceurRuntime.superCall(this, $FreeVariableChecker.prototype, "visitCatch", [tree]);
+      this.pop_(scope);
+    },
+    visitBindingIdentifier: function(tree) {
+      this.declareVariable_(tree);
+    },
+    visitIdentifierExpression: function(tree) {
+      if (this.disableChecksLevel_)
+        return;
+      var name = getVariableName(tree);
+      var scope = this.scope_;
+      if (!(name in scope.references)) {
+        scope.references[name] = tree.location;
+      }
+    },
+    visitUnaryExpression: function(tree) {
+      if (tree.operator.type === TYPEOF && tree.operand.type === IDENTIFIER_EXPRESSION) {
+        this.declareVariable_(tree.operand);
+      } else {
+        $traceurRuntime.superCall(this, $FreeVariableChecker.prototype, "visitUnaryExpression", [tree]);
+      }
+    },
+    visitWithStatement: function(tree) {
+      this.visitAny(tree.expression);
+      this.disableChecksLevel_++;
+      this.visitAny(tree.body);
+      this.disableChecksLevel_--;
+    },
+    declareVariable_: function(tree) {
+      var name = getVariableName(tree);
+      if (name) {
+        var scope = this.scope_;
+        if (!(name in scope.declarations)) {
+          scope.declarations[name] = tree.location;
+        }
+      }
+    },
+    validateScope_: function() {
+      var $__21 = this;
+      if (this.disableChecksLevel_)
+        return;
+      var scope = this.scope_;
+      var errors = [];
+      for (var name in scope.references) {
+        if (!(name in scope.declarations)) {
+          var location = scope.references[name];
+          if (!scope.parent) {
+            if (!location) {
+              throw new Error(("generated variable " + name + " is not defined"));
+            }
+            errors.push([location.start, (name + " is not defined")]);
+          } else if (!(name in scope.parent.references)) {
+            scope.parent.references[name] = location;
+          }
+        }
+      }
+      if (errors.length) {
+        errors.sort((function(x, y) {
+          return x[0].offset - y[0].offset;
+        }));
+        errors.forEach((function(args) {
+          var $__24;
+          ($__24 = $__21).reportError_.apply($__24, $traceurRuntime.toObject(args));
+        }));
+      }
+    },
+    reportError_: function(location, message) {
+      this.reporter_.reportError(location, message);
+    }
+  }, {checkScript: function(reporter, tree) {
+      new $FreeVariableChecker(reporter).visitScript(tree, global);
+    }}, ParseTreeVisitor);
+  return {
+    get getVariableName() {
+      return getVariableName;
+    },
+    get FreeVariableChecker() {
+      return FreeVariableChecker;
+    }
+  };
+});
+System.register("traceur@0.0.32/src/syntax/Keywords", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/syntax/Keywords";
+  var keywords = ['break', 'case', 'catch', 'class', 'const', 'continue', 'debugger', 'default', 'delete', 'do', 'else', 'export', 'finally', 'for', 'function', 'if', 'import', 'in', 'instanceof', 'let', 'new', 'return', 'super', 'switch', 'this', 'throw', 'try', 'typeof', 'var', 'void', 'while', 'with', 'enum', 'extends', 'null', 'true', 'false', 'await'];
+  var strictKeywords = ['implements', 'interface', 'package', 'private', 'protected', 'public', 'static', 'yield'];
+  var keywordsByName = Object.create(null);
+  var NORMAL_KEYWORD = 1;
+  var STRICT_KEYWORD = 2;
+  keywords.forEach((function(value) {
+    keywordsByName[value] = NORMAL_KEYWORD;
+  }));
+  strictKeywords.forEach((function(value) {
+    keywordsByName[value] = STRICT_KEYWORD;
+  }));
+  function getKeywordType(value) {
+    return keywordsByName[value];
+  }
+  function isStrictKeyword(value) {
+    return getKeywordType(value) === STRICT_KEYWORD;
+  }
+  return {
+    get NORMAL_KEYWORD() {
+      return NORMAL_KEYWORD;
+    },
+    get STRICT_KEYWORD() {
+      return STRICT_KEYWORD;
+    },
+    get getKeywordType() {
+      return getKeywordType;
+    },
+    get isStrictKeyword() {
+      return isStrictKeyword;
+    }
+  };
+});
+System.register("traceur@0.0.32/src/syntax/KeywordToken", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/syntax/KeywordToken";
+  var STRICT_KEYWORD = System.get("traceur@0.0.32/src/syntax/Keywords").STRICT_KEYWORD;
+  var Token = System.get("traceur@0.0.32/src/syntax/Token").Token;
+  var KeywordToken = function KeywordToken(type, keywordType, location) {
+    this.type = type;
+    this.location = location;
+    this.isStrictKeyword_ = keywordType === STRICT_KEYWORD;
+  };
+  ($traceurRuntime.createClass)(KeywordToken, {
+    isKeyword: function() {
+      return true;
+    },
+    isStrictKeyword: function() {
+      return this.isStrictKeyword_;
+    }
+  }, {}, Token);
+  return {get KeywordToken() {
+      return KeywordToken;
+    }};
+});
+System.register("traceur@0.0.32/src/syntax/LiteralToken", [], function() {
+  "use strict";
+  var $__28;
+  var __moduleName = "traceur@0.0.32/src/syntax/LiteralToken";
+  var Token = System.get("traceur@0.0.32/src/syntax/Token").Token;
+  var $__31 = System.get("traceur@0.0.32/src/syntax/TokenType"),
+      NULL = $__31.NULL,
+      NUMBER = $__31.NUMBER,
+      STRING = $__31.STRING;
+  var StringParser = function StringParser(value) {
+    this.value = value;
+    this.index = 0;
+  };
+  ($traceurRuntime.createClass)(StringParser, ($__28 = {}, Object.defineProperty($__28, Symbol.iterator, {
+    value: function() {
+      return this;
+    },
+    configurable: true,
+    enumerable: true,
+    writable: true
+  }), Object.defineProperty($__28, "next", {
+    value: function() {
+      if (++this.index >= this.value.length - 1)
+        return {
+          value: undefined,
+          done: true
+        };
+      return {
+        value: this.value[this.index],
+        done: false
+      };
+    },
+    configurable: true,
+    enumerable: true,
+    writable: true
+  }), Object.defineProperty($__28, "parse", {
+    value: function() {
+      if (this.value.indexOf('\\') === -1)
+        return this.value.slice(1, -1);
+      var result = '';
+      for (var $__29 = this[Symbol.iterator](),
+          $__30; !($__30 = $__29.next()).done; ) {
+        var ch = $__30.value;
+        {
+          result += ch === '\\' ? this.parseEscapeSequence() : ch;
+        }
+      }
+      return result;
+    },
+    configurable: true,
+    enumerable: true,
+    writable: true
+  }), Object.defineProperty($__28, "parseEscapeSequence", {
+    value: function() {
+      var ch = this.next();
+      switch (ch) {
+        case '\n':
+        case '\r':
+        case '\u2028':
+        case '\u2029':
+          return '';
+        case '0':
+          return '\0';
+        case 'b':
+          return '\b';
+        case 'f':
+          return '\f';
+        case 'n':
+          return '\n';
+        case 'r':
+          return '\r';
+        case 't':
+          return '\t';
+        case 'v':
+          return '\v';
+        case 'x':
+          return String.fromCharCode(parseInt(this.next() + this.next(), 16));
+        case 'u':
+          return String.fromCharCode(parseInt(this.next() + this.next() + this.next() + this.next(), 16));
+        default:
+          if (Number(ch) < 8)
+            throw new Error('Octal literals are not supported');
+          return ch;
+      }
+    },
+    configurable: true,
+    enumerable: true,
+    writable: true
+  }), $__28), {});
+  var LiteralToken = function LiteralToken(type, value, location) {
+    this.type = type;
+    this.location = location;
+    this.value = value;
+  };
+  ($traceurRuntime.createClass)(LiteralToken, {
+    toString: function() {
+      return this.value;
+    },
+    get processedValue() {
+      switch (this.type) {
+        case NULL:
+          return null;
+        case NUMBER:
+          var value = this.value;
+          if (value.charCodeAt(0) === 48) {
+            switch (value.charCodeAt(1)) {
+              case 66:
+              case 98:
+                return parseInt(this.value.slice(2), 2);
+              case 79:
+              case 111:
+                return parseInt(this.value.slice(2), 8);
+            }
+          }
+          return Number(this.value);
+        case STRING:
+          var parser = new StringParser(this.value);
+          return parser.parse();
+        default:
+          throw new Error('Not implemented');
+      }
+    }
+  }, {}, Token);
+  return {get LiteralToken() {
+      return LiteralToken;
+    }};
+});
+System.register("traceur@0.0.32/src/syntax/unicode-tables", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/syntax/unicode-tables";
+  var idStartTable = [170, 170, 181, 181, 186, 186, 192, 214, 216, 246, 248, 442, 443, 443, 444, 447, 448, 451, 452, 659, 660, 660, 661, 687, 688, 705, 710, 721, 736, 740, 748, 748, 750, 750, 880, 883, 884, 884, 886, 887, 890, 890, 891, 893, 902, 902, 904, 906, 908, 908, 910, 929, 931, 1013, 1015, 1153, 1162, 1319, 1329, 1366, 1369, 1369, 1377, 1415, 1488, 1514, 1520, 1522, 1568, 1599, 1600, 1600, 1601, 1610, 1646, 1647, 1649, 1747, 1749, 1749, 1765, 1766, 1774, 1775, 1786, 1788, 1791, 1791, 1808, 1808, 1810, 1839, 1869, 1957, 1969, 1969, 1994, 2026, 2036, 2037, 2042, 2042, 2048, 2069, 2074, 2074, 2084, 2084, 2088, 2088, 2112, 2136, 2208, 2208, 2210, 2220, 2308, 2361, 2365, 2365, 2384, 2384, 2392, 2401, 2417, 2417, 2418, 2423, 2425, 2431, 2437, 2444, 2447, 2448, 2451, 2472, 2474, 2480, 2482, 2482, 2486, 2489, 2493, 2493, 2510, 2510, 2524, 2525, 2527, 2529, 2544, 2545, 2565, 2570, 2575, 2576, 2579, 2600, 2602, 2608, 2610, 2611, 2613, 2614, 2616, 2617, 2649, 2652, 2654, 2654, 2674, 2676, 2693, 2701, 2703, 2705, 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2749, 2749, 2768, 2768, 2784, 2785, 2821, 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2869, 2873, 2877, 2877, 2908, 2909, 2911, 2913, 2929, 2929, 2947, 2947, 2949, 2954, 2958, 2960, 2962, 2965, 2969, 2970, 2972, 2972, 2974, 2975, 2979, 2980, 2984, 2986, 2990, 3001, 3024, 3024, 3077, 3084, 3086, 3088, 3090, 3112, 3114, 3123, 3125, 3129, 3133, 3133, 3160, 3161, 3168, 3169, 3205, 3212, 3214, 3216, 3218, 3240, 3242, 3251, 3253, 3257, 3261, 3261, 3294, 3294, 3296, 3297, 3313, 3314, 3333, 3340, 3342, 3344, 3346, 3386, 3389, 3389, 3406, 3406, 3424, 3425, 3450, 3455, 3461, 3478, 3482, 3505, 3507, 3515, 3517, 3517, 3520, 3526, 3585, 3632, 3634, 3635, 3648, 3653, 3654, 3654, 3713, 3714, 3716, 3716, 3719, 3720, 3722, 3722, 3725, 3725, 3732, 3735, 3737, 3743, 3745, 3747, 3749, 3749, 3751, 3751, 3754, 3755, 3757, 3760, 3762, 3763, 3773, 3773, 3776, 3780, 3782, 3782, 3804, 3807, 3840, 3840, 3904, 3911, 3913, 3948, 3976, 3980, 4096, 4138, 4159, 4159, 4176, 4181, 4186, 4189, 4193, 4193, 4197, 4198, 4206, 4208, 4213, 4225, 4238, 4238, 4256, 4293, 4295, 4295, 4301, 4301, 4304, 4346, 4348, 4348, 4349, 4680, 4682, 4685, 4688, 4694, 4696, 4696, 4698, 4701, 4704, 4744, 4746, 4749, 4752, 4784, 4786, 4789, 4792, 4798, 4800, 4800, 4802, 4805, 4808, 4822, 4824, 4880, 4882, 4885, 4888, 4954, 4992, 5007, 5024, 5108, 5121, 5740, 5743, 5759, 5761, 5786, 5792, 5866, 5870, 5872, 5888, 5900, 5902, 5905, 5920, 5937, 5952, 5969, 5984, 5996, 5998, 6000, 6016, 6067, 6103, 6103, 6108, 6108, 6176, 6210, 6211, 6211, 6212, 6263, 6272, 6312, 6314, 6314, 6320, 6389, 6400, 6428, 6480, 6509, 6512, 6516, 6528, 6571, 6593, 6599, 6656, 6678, 6688, 6740, 6823, 6823, 6917, 6963, 6981, 6987, 7043, 7072, 7086, 7087, 7098, 7141, 7168, 7203, 7245, 7247, 7258, 7287, 7288, 7293, 7401, 7404, 7406, 7409, 7413, 7414, 7424, 7467, 7468, 7530, 7531, 7543, 7544, 7544, 7545, 7578, 7579, 7615, 7680, 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025, 8027, 8027, 8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130, 8132, 8134, 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188, 8305, 8305, 8319, 8319, 8336, 8348, 8450, 8450, 8455, 8455, 8458, 8467, 8469, 8469, 8472, 8472, 8473, 8477, 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8493, 8494, 8494, 8495, 8500, 8501, 8504, 8505, 8505, 8508, 8511, 8517, 8521, 8526, 8526, 8544, 8578, 8579, 8580, 8581, 8584, 11264, 11310, 11312, 11358, 11360, 11387, 11388, 11389, 11390, 11492, 11499, 11502, 11506, 11507, 11520, 11557, 11559, 11559, 11565, 11565, 11568, 11623, 11631, 11631, 11648, 11670, 11680, 11686, 11688, 11694, 11696, 11702, 11704, 11710, 11712, 11718, 11720, 11726, 11728, 11734, 11736, 11742, 12293, 12293, 12294, 12294, 12295, 12295, 12321, 12329, 12337, 12341, 12344, 12346, 12347, 12347, 12348, 12348, 12353, 12438, 12443, 12444, 12445, 12446, 12447, 12447, 12449, 12538, 12540, 12542, 12543, 12543, 12549, 12589, 12593, 12686, 12704, 12730, 12784, 12799, 13312, 19893, 19968, 40908, 40960, 40980, 40981, 40981, 40982, 42124, 42192, 42231, 42232, 42237, 42240, 42507, 42508, 42508, 42512, 42527, 42538, 42539, 42560, 42605, 42606, 42606, 42623, 42623, 42624, 42647, 42656, 42725, 42726, 42735, 42775, 42783, 42786, 42863, 42864, 42864, 42865, 42887, 42888, 42888, 42891, 42894, 42896, 42899, 42912, 42922, 43000, 43001, 43002, 43002, 43003, 43009, 43011, 43013, 43015, 43018, 43020, 43042, 43072, 43123, 43138, 43187, 43250, 43255, 43259, 43259, 43274, 43301, 43312, 43334, 43360, 43388, 43396, 43442, 43471, 43471, 43520, 43560, 43584, 43586, 43588, 43595, 43616, 43631, 43632, 43632, 43633, 43638, 43642, 43642, 43648, 43695, 43697, 43697, 43701, 43702, 43705, 43709, 43712, 43712, 43714, 43714, 43739, 43740, 43741, 43741, 43744, 43754, 43762, 43762, 43763, 43764, 43777, 43782, 43785, 43790, 43793, 43798, 43808, 43814, 43816, 43822, 43968, 44002, 44032, 55203, 55216, 55238, 55243, 55291, 63744, 64109, 64112, 64217, 64256, 64262, 64275, 64279, 64285, 64285, 64287, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321, 64323, 64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008, 65019, 65136, 65140, 65142, 65276, 65313, 65338, 65345, 65370, 65382, 65391, 65392, 65392, 65393, 65437, 65438, 65439, 65440, 65470, 65474, 65479, 65482, 65487, 65490, 65495, 65498, 65500, 65536, 65547, 65549, 65574, 65576, 65594, 65596, 65597, 65599, 65613, 65616, 65629, 65664, 65786, 65856, 65908, 66176, 66204, 66208, 66256, 66304, 66334, 66352, 66368, 66369, 66369, 66370, 66377, 66378, 66378, 66432, 66461, 66464, 66499, 66504, 66511, 66513, 66517, 66560, 66639, 66640, 66717, 67584, 67589, 67592, 67592, 67594, 67637, 67639, 67640, 67644, 67644, 67647, 67669, 67840, 67861, 67872, 67897, 67968, 68023, 68030, 68031, 68096, 68096, 68112, 68115, 68117, 68119, 68121, 68147, 68192, 68220, 68352, 68405, 68416, 68437, 68448, 68466, 68608, 68680, 69635, 69687, 69763, 69807, 69840, 69864, 69891, 69926, 70019, 70066, 70081, 70084, 71296, 71338, 73728, 74606, 74752, 74850, 77824, 78894, 92160, 92728, 93952, 94020, 94032, 94032, 94099, 94111, 110592, 110593, 119808, 119892, 119894, 119964, 119966, 119967, 119970, 119970, 119973, 119974, 119977, 119980, 119982, 119993, 119995, 119995, 119997, 120003, 120005, 120069, 120071, 120074, 120077, 120084, 120086, 120092, 120094, 120121, 120123, 120126, 120128, 120132, 120134, 120134, 120138, 120144, 120146, 120485, 120488, 120512, 120514, 120538, 120540, 120570, 120572, 120596, 120598, 120628, 120630, 120654, 120656, 120686, 120688, 120712, 120714, 120744, 120746, 120770, 120772, 120779, 126464, 126467, 126469, 126495, 126497, 126498, 126500, 126500, 126503, 126503, 126505, 126514, 126516, 126519, 126521, 126521, 126523, 126523, 126530, 126530, 126535, 126535, 126537, 126537, 126539, 126539, 126541, 126543, 126545, 126546, 126548, 126548, 126551, 126551, 126553, 126553, 126555, 126555, 126557, 126557, 126559, 126559, 126561, 126562, 126564, 126564, 126567, 126570, 126572, 126578, 126580, 126583, 126585, 126588, 126590, 126590, 126592, 126601, 126603, 126619, 126625, 126627, 126629, 126633, 126635, 126651, 131072, 173782, 173824, 177972, 177984, 178205, 194560, 195101];
+  var idContinueTable = [183, 183, 768, 879, 903, 903, 1155, 1159, 1425, 1469, 1471, 1471, 1473, 1474, 1476, 1477, 1479, 1479, 1552, 1562, 1611, 1631, 1632, 1641, 1648, 1648, 1750, 1756, 1759, 1764, 1767, 1768, 1770, 1773, 1776, 1785, 1809, 1809, 1840, 1866, 1958, 1968, 1984, 1993, 2027, 2035, 2070, 2073, 2075, 2083, 2085, 2087, 2089, 2093, 2137, 2139, 2276, 2302, 2304, 2306, 2307, 2307, 2362, 2362, 2363, 2363, 2364, 2364, 2366, 2368, 2369, 2376, 2377, 2380, 2381, 2381, 2382, 2383, 2385, 2391, 2402, 2403, 2406, 2415, 2433, 2433, 2434, 2435, 2492, 2492, 2494, 2496, 2497, 2500, 2503, 2504, 2507, 2508, 2509, 2509, 2519, 2519, 2530, 2531, 2534, 2543, 2561, 2562, 2563, 2563, 2620, 2620, 2622, 2624, 2625, 2626, 2631, 2632, 2635, 2637, 2641, 2641, 2662, 2671, 2672, 2673, 2677, 2677, 2689, 2690, 2691, 2691, 2748, 2748, 2750, 2752, 2753, 2757, 2759, 2760, 2761, 2761, 2763, 2764, 2765, 2765, 2786, 2787, 2790, 2799, 2817, 2817, 2818, 2819, 2876, 2876, 2878, 2878, 2879, 2879, 2880, 2880, 2881, 2884, 2887, 2888, 2891, 2892, 2893, 2893, 2902, 2902, 2903, 2903, 2914, 2915, 2918, 2927, 2946, 2946, 3006, 3007, 3008, 3008, 3009, 3010, 3014, 3016, 3018, 3020, 3021, 3021, 3031, 3031, 3046, 3055, 3073, 3075, 3134, 3136, 3137, 3140, 3142, 3144, 3146, 3149, 3157, 3158, 3170, 3171, 3174, 3183, 3202, 3203, 3260, 3260, 3262, 3262, 3263, 3263, 3264, 3268, 3270, 3270, 3271, 3272, 3274, 3275, 3276, 3277, 3285, 3286, 3298, 3299, 3302, 3311, 3330, 3331, 3390, 3392, 3393, 3396, 3398, 3400, 3402, 3404, 3405, 3405, 3415, 3415, 3426, 3427, 3430, 3439, 3458, 3459, 3530, 3530, 3535, 3537, 3538, 3540, 3542, 3542, 3544, 3551, 3570, 3571, 3633, 3633, 3636, 3642, 3655, 3662, 3664, 3673, 3761, 3761, 3764, 3769, 3771, 3772, 3784, 3789, 3792, 3801, 3864, 3865, 3872, 3881, 3893, 3893, 3895, 3895, 3897, 3897, 3902, 3903, 3953, 3966, 3967, 3967, 3968, 3972, 3974, 3975, 3981, 3991, 3993, 4028, 4038, 4038, 4139, 4140, 4141, 4144, 4145, 4145, 4146, 4151, 4152, 4152, 4153, 4154, 4155, 4156, 4157, 4158, 4160, 4169, 4182, 4183, 4184, 4185, 4190, 4192, 4194, 4196, 4199, 4205, 4209, 4212, 4226, 4226, 4227, 4228, 4229, 4230, 4231, 4236, 4237, 4237, 4239, 4239, 4240, 4249, 4250, 4252, 4253, 4253, 4957, 4959, 4969, 4977, 5906, 5908, 5938, 5940, 5970, 5971, 6002, 6003, 6068, 6069, 6070, 6070, 6071, 6077, 6078, 6085, 6086, 6086, 6087, 6088, 6089, 6099, 6109, 6109, 6112, 6121, 6155, 6157, 6160, 6169, 6313, 6313, 6432, 6434, 6435, 6438, 6439, 6440, 6441, 6443, 6448, 6449, 6450, 6450, 6451, 6456, 6457, 6459, 6470, 6479, 6576, 6592, 6600, 6601, 6608, 6617, 6618, 6618, 6679, 6680, 6681, 6683, 6741, 6741, 6742, 6742, 6743, 6743, 6744, 6750, 6752, 6752, 6753, 6753, 6754, 6754, 6755, 6756, 6757, 6764, 6765, 6770, 6771, 6780, 6783, 6783, 6784, 6793, 6800, 6809, 6912, 6915, 6916, 6916, 6964, 6964, 6965, 6965, 6966, 6970, 6971, 6971, 6972, 6972, 6973, 6977, 6978, 6978, 6979, 6980, 6992, 7001, 7019, 7027, 7040, 7041, 7042, 7042, 7073, 7073, 7074, 7077, 7078, 7079, 7080, 7081, 7082, 7082, 7083, 7083, 7084, 7085, 7088, 7097, 7142, 7142, 7143, 7143, 7144, 7145, 7146, 7148, 7149, 7149, 7150, 7150, 7151, 7153, 7154, 7155, 7204, 7211, 7212, 7219, 7220, 7221, 7222, 7223, 7232, 7241, 7248, 7257, 7376, 7378, 7380, 7392, 7393, 7393, 7394, 7400, 7405, 7405, 7410, 7411, 7412, 7412, 7616, 7654, 7676, 7679, 8255, 8256, 8276, 8276, 8400, 8412, 8417, 8417, 8421, 8432, 11503, 11505, 11647, 11647, 11744, 11775, 12330, 12333, 12334, 12335, 12441, 12442, 42528, 42537, 42607, 42607, 42612, 42621, 42655, 42655, 42736, 42737, 43010, 43010, 43014, 43014, 43019, 43019, 43043, 43044, 43045, 43046, 43047, 43047, 43136, 43137, 43188, 43203, 43204, 43204, 43216, 43225, 43232, 43249, 43264, 43273, 43302, 43309, 43335, 43345, 43346, 43347, 43392, 43394, 43395, 43395, 43443, 43443, 43444, 43445, 43446, 43449, 43450, 43451, 43452, 43452, 43453, 43456, 43472, 43481, 43561, 43566, 43567, 43568, 43569, 43570, 43571, 43572, 43573, 43574, 43587, 43587, 43596, 43596, 43597, 43597, 43600, 43609, 43643, 43643, 43696, 43696, 43698, 43700, 43703, 43704, 43710, 43711, 43713, 43713, 43755, 43755, 43756, 43757, 43758, 43759, 43765, 43765, 43766, 43766, 44003, 44004, 44005, 44005, 44006, 44007, 44008, 44008, 44009, 44010, 44012, 44012, 44013, 44013, 44016, 44025, 64286, 64286, 65024, 65039, 65056, 65062, 65075, 65076, 65101, 65103, 65296, 65305, 65343, 65343, 66045, 66045, 66720, 66729, 68097, 68099, 68101, 68102, 68108, 68111, 68152, 68154, 68159, 68159, 69632, 69632, 69633, 69633, 69634, 69634, 69688, 69702, 69734, 69743, 69760, 69761, 69762, 69762, 69808, 69810, 69811, 69814, 69815, 69816, 69817, 69818, 69872, 69881, 69888, 69890, 69927, 69931, 69932, 69932, 69933, 69940, 69942, 69951, 70016, 70017, 70018, 70018, 70067, 70069, 70070, 70078, 70079, 70080, 70096, 70105, 71339, 71339, 71340, 71340, 71341, 71341, 71342, 71343, 71344, 71349, 71350, 71350, 71351, 71351, 71360, 71369, 94033, 94078, 94095, 94098, 119141, 119142, 119143, 119145, 119149, 119154, 119163, 119170, 119173, 119179, 119210, 119213, 119362, 119364, 120782, 120831, 917760, 917999];
+  return {
+    get idStartTable() {
+      return idStartTable;
+    },
+    get idContinueTable() {
+      return idContinueTable;
+    }
+  };
+});
+System.register("traceur@0.0.32/src/syntax/Scanner", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/syntax/Scanner";
+  var IdentifierToken = System.get("traceur@0.0.32/src/syntax/IdentifierToken").IdentifierToken;
+  var KeywordToken = System.get("traceur@0.0.32/src/syntax/KeywordToken").KeywordToken;
+  var LiteralToken = System.get("traceur@0.0.32/src/syntax/LiteralToken").LiteralToken;
+  var Token = System.get("traceur@0.0.32/src/syntax/Token").Token;
+  var getKeywordType = System.get("traceur@0.0.32/src/syntax/Keywords").getKeywordType;
+  var $__33 = System.get("traceur@0.0.32/src/syntax/unicode-tables"),
+      idContinueTable = $__33.idContinueTable,
+      idStartTable = $__33.idStartTable;
+  var $__33 = System.get("traceur@0.0.32/src/options"),
+      options = $__33.options,
+      parseOptions = $__33.parseOptions;
+  var $__33 = System.get("traceur@0.0.32/src/syntax/TokenType"),
+      AMPERSAND = $__33.AMPERSAND,
+      AMPERSAND_EQUAL = $__33.AMPERSAND_EQUAL,
+      AND = $__33.AND,
+      ARROW = $__33.ARROW,
+      AT = $__33.AT,
+      AWAIT = $__33.AWAIT,
+      BACK_QUOTE = $__33.BACK_QUOTE,
+      BANG = $__33.BANG,
+      BAR = $__33.BAR,
+      BAR_EQUAL = $__33.BAR_EQUAL,
+      BREAK = $__33.BREAK,
+      CARET = $__33.CARET,
+      CARET_EQUAL = $__33.CARET_EQUAL,
+      CASE = $__33.CASE,
+      CATCH = $__33.CATCH,
+      CLASS = $__33.CLASS,
+      CLOSE_ANGLE = $__33.CLOSE_ANGLE,
+      CLOSE_CURLY = $__33.CLOSE_CURLY,
+      CLOSE_PAREN = $__33.CLOSE_PAREN,
+      CLOSE_SQUARE = $__33.CLOSE_SQUARE,
+      COLON = $__33.COLON,
+      COMMA = $__33.COMMA,
+      CONST = $__33.CONST,
+      CONTINUE = $__33.CONTINUE,
+      DEBUGGER = $__33.DEBUGGER,
+      DEFAULT = $__33.DEFAULT,
+      DELETE = $__33.DELETE,
+      DO = $__33.DO,
+      DOT_DOT_DOT = $__33.DOT_DOT_DOT,
+      ELSE = $__33.ELSE,
+      END_OF_FILE = $__33.END_OF_FILE,
+      ENUM = $__33.ENUM,
+      EQUAL = $__33.EQUAL,
+      EQUAL_EQUAL = $__33.EQUAL_EQUAL,
+      EQUAL_EQUAL_EQUAL = $__33.EQUAL_EQUAL_EQUAL,
+      ERROR = $__33.ERROR,
+      EXPORT = $__33.EXPORT,
+      EXTENDS = $__33.EXTENDS,
+      FALSE = $__33.FALSE,
+      FINALLY = $__33.FINALLY,
+      FOR = $__33.FOR,
+      FUNCTION = $__33.FUNCTION,
+      GREATER_EQUAL = $__33.GREATER_EQUAL,
+      IDENTIFIER = $__33.IDENTIFIER,
+      IF = $__33.IF,
+      IMPLEMENTS = $__33.IMPLEMENTS,
+      IMPORT = $__33.IMPORT,
+      IN = $__33.IN,
+      INSTANCEOF = $__33.INSTANCEOF,
+      INTERFACE = $__33.INTERFACE,
+      LEFT_SHIFT = $__33.LEFT_SHIFT,
+      LEFT_SHIFT_EQUAL = $__33.LEFT_SHIFT_EQUAL,
+      LESS_EQUAL = $__33.LESS_EQUAL,
+      LET = $__33.LET,
+      MINUS = $__33.MINUS,
+      MINUS_EQUAL = $__33.MINUS_EQUAL,
+      MINUS_MINUS = $__33.MINUS_MINUS,
+      NEW = $__33.NEW,
+      NO_SUBSTITUTION_TEMPLATE = $__33.NO_SUBSTITUTION_TEMPLATE,
+      NOT_EQUAL = $__33.NOT_EQUAL,
+      NOT_EQUAL_EQUAL = $__33.NOT_EQUAL_EQUAL,
+      NULL = $__33.NULL,
+      NUMBER = $__33.NUMBER,
+      OPEN_ANGLE = $__33.OPEN_ANGLE,
+      OPEN_CURLY = $__33.OPEN_CURLY,
+      OPEN_PAREN = $__33.OPEN_PAREN,
+      OPEN_SQUARE = $__33.OPEN_SQUARE,
+      OR = $__33.OR,
+      PACKAGE = $__33.PACKAGE,
+      PERCENT = $__33.PERCENT,
+      PERCENT_EQUAL = $__33.PERCENT_EQUAL,
+      PERIOD = $__33.PERIOD,
+      PLUS = $__33.PLUS,
+      PLUS_EQUAL = $__33.PLUS_EQUAL,
+      PLUS_PLUS = $__33.PLUS_PLUS,
+      PRIVATE = $__33.PRIVATE,
+      PROTECTED = $__33.PROTECTED,
+      PUBLIC = $__33.PUBLIC,
+      QUESTION = $__33.QUESTION,
+      REGULAR_EXPRESSION = $__33.REGULAR_EXPRESSION,
+      RETURN = $__33.RETURN,
+      RIGHT_SHIFT = $__33.RIGHT_SHIFT,
+      RIGHT_SHIFT_EQUAL = $__33.RIGHT_SHIFT_EQUAL,
+      SEMI_COLON = $__33.SEMI_COLON,
+      SLASH = $__33.SLASH,
+      SLASH_EQUAL = $__33.SLASH_EQUAL,
+      STAR = $__33.STAR,
+      STAR_EQUAL = $__33.STAR_EQUAL,
+      STATIC = $__33.STATIC,
+      STRING = $__33.STRING,
+      SUPER = $__33.SUPER,
+      SWITCH = $__33.SWITCH,
+      TEMPLATE_HEAD = $__33.TEMPLATE_HEAD,
+      TEMPLATE_MIDDLE = $__33.TEMPLATE_MIDDLE,
+      TEMPLATE_TAIL = $__33.TEMPLATE_TAIL,
+      THIS = $__33.THIS,
+      THROW = $__33.THROW,
+      TILDE = $__33.TILDE,
+      TRUE = $__33.TRUE,
+      TRY = $__33.TRY,
+      TYPEOF = $__33.TYPEOF,
+      UNSIGNED_RIGHT_SHIFT = $__33.UNSIGNED_RIGHT_SHIFT,
+      UNSIGNED_RIGHT_SHIFT_EQUAL = $__33.UNSIGNED_RIGHT_SHIFT_EQUAL,
+      VAR = $__33.VAR,
+      VOID = $__33.VOID,
+      WHILE = $__33.WHILE,
+      WITH = $__33.WITH,
+      YIELD = $__33.YIELD;
+  var isWhitespaceArray = [];
+  for (var i = 0; i < 128; i++) {
+    isWhitespaceArray[i] = i >= 9 && i <= 13 || i === 0x20;
+  }
+  var isWhitespaceArray = [];
+  for (var i = 0; i < 128; i++) {
+    isWhitespaceArray[i] = i >= 9 && i <= 13 || i === 0x20;
+  }
+  function isWhitespace(code) {
+    if (code < 128)
+      return isWhitespaceArray[code];
+    switch (code) {
+      case 0xA0:
+      case 0xFEFF:
+      case 0x2028:
+      case 0x2029:
+        return true;
+    }
+    return false;
+  }
+  function isLineTerminator(code) {
+    switch (code) {
+      case 10:
+      case 13:
+      case 0x2028:
+      case 0x2029:
+        return true;
+    }
+    return false;
+  }
+  function isDecimalDigit(code) {
+    return code >= 48 && code <= 57;
+  }
+  var isHexDigitArray = [];
+  for (var i = 0; i < 128; i++) {
+    isHexDigitArray[i] = i >= 48 && i <= 57 || i >= 65 && i <= 70 || i >= 97 && i <= 102;
+  }
+  function isHexDigit(code) {
+    return code < 128 && isHexDigitArray[code];
+  }
+  function isBinaryDigit(code) {
+    return code === 48 || code === 49;
+  }
+  function isOctalDigit(code) {
+    return code >= 48 && code <= 55;
+  }
+  var isIdentifierStartArray = [];
+  for (var i = 0; i < 128; i++) {
+    isIdentifierStartArray[i] = i === 36 || i >= 65 && i <= 90 || i === 95 || i >= 97 && i <= 122;
+  }
+  function isIdentifierStart(code) {
+    return code < 128 ? isIdentifierStartArray[code] : inTable(idStartTable, code);
+  }
+  var isIdentifierPartArray = [];
+  for (var i = 0; i < 128; i++) {
+    isIdentifierPartArray[i] = isIdentifierStart(i) || isDecimalDigit(i);
+  }
+  function isIdentifierPart(code) {
+    return code < 128 ? isIdentifierPartArray[code] : inTable(idStartTable, code) || inTable(idContinueTable, code) || code === 8204 || code === 8205;
+  }
+  function inTable(table, code) {
+    for (var i = 0; i < table.length; ) {
+      if (code < table[i++])
+        return false;
+      if (code <= table[i++])
+        return true;
+    }
+    return false;
+  }
+  function isRegularExpressionChar(code) {
+    switch (code) {
+      case 47:
+        return false;
+      case 91:
+      case 92:
+        return true;
+    }
+    return !isLineTerminator(code);
+  }
+  function isRegularExpressionFirstChar(code) {
+    return isRegularExpressionChar(code) && code !== 42;
+  }
+  var index,
+      input,
+      length,
+      token,
+      lastToken,
+      lookaheadToken,
+      currentCharCode,
+      lineNumberTable,
+      errorReporter,
+      currentParser;
+  var Scanner = function Scanner(reporter, file, parser) {
+    errorReporter = reporter;
+    lineNumberTable = file.lineNumberTable;
+    input = file.contents;
+    length = file.contents.length;
+    index = 0;
+    lastToken = null;
+    token = null;
+    lookaheadToken = null;
+    updateCurrentCharCode();
+    currentParser = parser;
+  };
+  ($traceurRuntime.createClass)(Scanner, {
+    get lastToken() {
+      return lastToken;
+    },
+    getPosition: function() {
+      return getPosition(getOffset());
+    },
+    nextRegularExpressionLiteralToken: function() {
+      lastToken = nextRegularExpressionLiteralToken();
+      token = scanToken();
+      return lastToken;
+    },
+    nextTemplateLiteralToken: function() {
+      var t = nextTemplateLiteralToken();
+      token = scanToken();
+      return t;
+    },
+    nextToken: function() {
+      return nextToken();
+    },
+    peekToken: function(opt_index) {
+      return opt_index ? peekTokenLookahead() : peekToken();
+    },
+    peekTokenNoLineTerminator: function() {
+      return peekTokenNoLineTerminator();
+    },
+    isAtEnd: function() {
+      return isAtEnd();
+    }
+  }, {});
+  function getPosition(offset) {
+    return lineNumberTable.getSourcePosition(offset);
+  }
+  function getTokenRange(startOffset) {
+    return lineNumberTable.getSourceRange(startOffset, index);
+  }
+  function getOffset() {
+    return token ? token.location.start.offset : index;
+  }
+  function nextRegularExpressionLiteralToken() {
+    var beginIndex = index - token.toString().length;
+    if (!skipRegularExpressionBody()) {
+      return new LiteralToken(REGULAR_EXPRESSION, getTokenString(beginIndex), getTokenRange(beginIndex));
+    }
+    if (currentCharCode !== 47) {
+      reportError('Expected \'/\' in regular expression literal');
+      return new LiteralToken(REGULAR_EXPRESSION, getTokenString(beginIndex), getTokenRange(beginIndex));
+    }
+    next();
+    while (isIdentifierPart(currentCharCode)) {
+      next();
+    }
+    return new LiteralToken(REGULAR_EXPRESSION, getTokenString(beginIndex), getTokenRange(beginIndex));
+  }
+  function skipRegularExpressionBody() {
+    if (!isRegularExpressionFirstChar(currentCharCode)) {
+      reportError('Expected regular expression first char');
+      return false;
+    }
+    while (!isAtEnd() && isRegularExpressionChar(currentCharCode)) {
+      if (!skipRegularExpressionChar())
+        return false;
+    }
+    return true;
+  }
+  function skipRegularExpressionChar() {
+    switch (currentCharCode) {
+      case 92:
+        return skipRegularExpressionBackslashSequence();
+      case 91:
+        return skipRegularExpressionClass();
+      default:
+        next();
+        return true;
+    }
+  }
+  function skipRegularExpressionBackslashSequence() {
+    next();
+    if (isLineTerminator(currentCharCode) || isAtEnd()) {
+      reportError('New line not allowed in regular expression literal');
+      return false;
+    }
+    next();
+    return true;
+  }
+  function skipRegularExpressionClass() {
+    next();
+    while (!isAtEnd() && peekRegularExpressionClassChar()) {
+      if (!skipRegularExpressionClassChar()) {
+        return false;
+      }
+    }
+    if (currentCharCode !== 93) {
+      reportError('\']\' expected');
+      return false;
+    }
+    next();
+    return true;
+  }
+  function peekRegularExpressionClassChar() {
+    return currentCharCode !== 93 && !isLineTerminator(currentCharCode);
+  }
+  function skipRegularExpressionClassChar() {
+    if (currentCharCode === 92) {
+      return skipRegularExpressionBackslashSequence();
+    }
+    next();
+    return true;
+  }
+  function skipTemplateCharacter() {
+    while (!isAtEnd()) {
+      switch (currentCharCode) {
+        case 96:
+          return;
+        case 92:
+          skipStringLiteralEscapeSequence();
+          break;
+        case 36:
+          var code = input.charCodeAt(index + 1);
+          if (code === 123)
+            return;
+        default:
+          next();
+      }
+    }
+  }
+  function scanTemplateStart(beginIndex) {
+    if (isAtEnd()) {
+      reportError('Unterminated template literal');
+      return lastToken = createToken(END_OF_FILE, beginIndex);
+    }
+    return nextTemplateLiteralTokenShared(NO_SUBSTITUTION_TEMPLATE, TEMPLATE_HEAD);
+  }
+  function nextTemplateLiteralToken() {
+    if (isAtEnd()) {
+      reportError('Expected \'}\' after expression in template literal');
+      return createToken(END_OF_FILE, index);
+    }
+    if (token.type !== CLOSE_CURLY) {
+      reportError('Expected \'}\' after expression in template literal');
+      return createToken(ERROR, index);
+    }
+    return nextTemplateLiteralTokenShared(TEMPLATE_TAIL, TEMPLATE_MIDDLE);
+  }
+  function nextTemplateLiteralTokenShared(endType, middleType) {
+    var beginIndex = index;
+    skipTemplateCharacter();
+    if (isAtEnd()) {
+      reportError('Unterminated template literal');
+      return createToken(ERROR, beginIndex);
+    }
+    var value = getTokenString(beginIndex);
+    switch (currentCharCode) {
+      case 96:
+        next();
+        return lastToken = new LiteralToken(endType, value, getTokenRange(beginIndex - 1));
+      case 36:
+        next();
+        next();
+        return lastToken = new LiteralToken(middleType, value, getTokenRange(beginIndex - 1));
+    }
+  }
+  function nextToken() {
+    var t = peekToken();
+    token = lookaheadToken || scanToken();
+    lookaheadToken = null;
+    lastToken = t;
+    return t;
+  }
+  function peekTokenNoLineTerminator() {
+    var t = peekToken();
+    var start = lastToken.location.end.offset;
+    var end = t.location.start.offset;
+    for (var i = start; i < end; i++) {
+      var code = input.charCodeAt(i);
+      if (isLineTerminator(code))
+        return null;
+      if (code === 47) {
+        code = input.charCodeAt(++i);
+        if (code === 47)
+          return null;
+        i = input.indexOf('*/', i) + 2;
+      }
+    }
+    return t;
+  }
+  function peekToken() {
+    return token || (token = scanToken());
+  }
+  function peekTokenLookahead() {
+    if (!token)
+      token = scanToken();
+    if (!lookaheadToken)
+      lookaheadToken = scanToken();
+    return lookaheadToken;
+  }
+  function skipWhitespace() {
+    while (!isAtEnd() && peekWhitespace()) {
+      next();
+    }
+  }
+  function peekWhitespace() {
+    return isWhitespace(currentCharCode);
+  }
+  function skipComments() {
+    while (skipComment()) {}
+  }
+  function skipComment() {
+    skipWhitespace();
+    var code = currentCharCode;
+    if (code === 47) {
+      code = input.charCodeAt(index + 1);
+      switch (code) {
+        case 47:
+          skipSingleLineComment();
+          return true;
+        case 42:
+          skipMultiLineComment();
+          return true;
+      }
+    }
+    return false;
+  }
+  function commentCallback(start, index) {
+    if (options.commentCallback)
+      currentParser.handleComment(lineNumberTable.getSourceRange(start, index));
+  }
+  function skipSingleLineComment() {
+    var start = index;
+    index += 2;
+    while (!isAtEnd() && !isLineTerminator(input.charCodeAt(index++))) {}
+    updateCurrentCharCode();
+    commentCallback(start, index);
+  }
+  function skipMultiLineComment() {
+    var start = index;
+    var i = input.indexOf('*/', index + 2);
+    if (i !== -1)
+      index = i + 2;
+    else
+      index = length;
+    updateCurrentCharCode();
+    commentCallback(start, index);
+  }
+  function scanToken() {
+    skipComments();
+    var beginIndex = index;
+    if (isAtEnd())
+      return createToken(END_OF_FILE, beginIndex);
+    var code = currentCharCode;
+    next();
+    switch (code) {
+      case 123:
+        return createToken(OPEN_CURLY, beginIndex);
+      case 125:
+        return createToken(CLOSE_CURLY, beginIndex);
+      case 40:
+        return createToken(OPEN_PAREN, beginIndex);
+      case 41:
+        return createToken(CLOSE_PAREN, beginIndex);
+      case 91:
+        return createToken(OPEN_SQUARE, beginIndex);
+      case 93:
+        return createToken(CLOSE_SQUARE, beginIndex);
+      case 46:
+        switch (currentCharCode) {
+          case 46:
+            if (input.charCodeAt(index + 1) === 46) {
+              next();
+              next();
+              return createToken(DOT_DOT_DOT, beginIndex);
+            }
+            break;
+          default:
+            if (isDecimalDigit(currentCharCode))
+              return scanNumberPostPeriod(beginIndex);
+        }
+        return createToken(PERIOD, beginIndex);
+      case 59:
+        return createToken(SEMI_COLON, beginIndex);
+      case 44:
+        return createToken(COMMA, beginIndex);
+      case 126:
+        return createToken(TILDE, beginIndex);
+      case 63:
+        return createToken(QUESTION, beginIndex);
+      case 58:
+        return createToken(COLON, beginIndex);
+      case 60:
+        switch (currentCharCode) {
+          case 60:
+            next();
+            if (currentCharCode === 61) {
+              next();
+              return createToken(LEFT_SHIFT_EQUAL, beginIndex);
+            }
+            return createToken(LEFT_SHIFT, beginIndex);
+          case 61:
+            next();
+            return createToken(LESS_EQUAL, beginIndex);
+          default:
+            return createToken(OPEN_ANGLE, beginIndex);
+        }
+      case 62:
+        switch (currentCharCode) {
+          case 62:
+            next();
+            switch (currentCharCode) {
+              case 61:
+                next();
+                return createToken(RIGHT_SHIFT_EQUAL, beginIndex);
+              case 62:
+                next();
+                if (currentCharCode === 61) {
+                  next();
+                  return createToken(UNSIGNED_RIGHT_SHIFT_EQUAL, beginIndex);
+                }
+                return createToken(UNSIGNED_RIGHT_SHIFT, beginIndex);
+              default:
+                return createToken(RIGHT_SHIFT, beginIndex);
+            }
+          case 61:
+            next();
+            return createToken(GREATER_EQUAL, beginIndex);
+          default:
+            return createToken(CLOSE_ANGLE, beginIndex);
+        }
+      case 61:
+        if (currentCharCode === 61) {
+          next();
+          if (currentCharCode === 61) {
+            next();
+            return createToken(EQUAL_EQUAL_EQUAL, beginIndex);
+          }
+          return createToken(EQUAL_EQUAL, beginIndex);
+        }
+        if (currentCharCode === 62) {
+          next();
+          return createToken(ARROW, beginIndex);
+        }
+        return createToken(EQUAL, beginIndex);
+      case 33:
+        if (currentCharCode === 61) {
+          next();
+          if (currentCharCode === 61) {
+            next();
+            return createToken(NOT_EQUAL_EQUAL, beginIndex);
+          }
+          return createToken(NOT_EQUAL, beginIndex);
+        }
+        return createToken(BANG, beginIndex);
+      case 42:
+        if (currentCharCode === 61) {
+          next();
+          return createToken(STAR_EQUAL, beginIndex);
+        }
+        return createToken(STAR, beginIndex);
+      case 37:
+        if (currentCharCode === 61) {
+          next();
+          return createToken(PERCENT_EQUAL, beginIndex);
+        }
+        return createToken(PERCENT, beginIndex);
+      case 94:
+        if (currentCharCode === 61) {
+          next();
+          return createToken(CARET_EQUAL, beginIndex);
+        }
+        return createToken(CARET, beginIndex);
+      case 47:
+        if (currentCharCode === 61) {
+          next();
+          return createToken(SLASH_EQUAL, beginIndex);
+        }
+        return createToken(SLASH, beginIndex);
+      case 43:
+        switch (currentCharCode) {
+          case 43:
+            next();
+            return createToken(PLUS_PLUS, beginIndex);
+          case 61:
+            next();
+            return createToken(PLUS_EQUAL, beginIndex);
+          default:
+            return createToken(PLUS, beginIndex);
+        }
+      case 45:
+        switch (currentCharCode) {
+          case 45:
+            next();
+            return createToken(MINUS_MINUS, beginIndex);
+          case 61:
+            next();
+            return createToken(MINUS_EQUAL, beginIndex);
+          default:
+            return createToken(MINUS, beginIndex);
+        }
+      case 38:
+        switch (currentCharCode) {
+          case 38:
+            next();
+            return createToken(AND, beginIndex);
+          case 61:
+            next();
+            return createToken(AMPERSAND_EQUAL, beginIndex);
+          default:
+            return createToken(AMPERSAND, beginIndex);
+        }
+      case 124:
+        switch (currentCharCode) {
+          case 124:
+            next();
+            return createToken(OR, beginIndex);
+          case 61:
+            next();
+            return createToken(BAR_EQUAL, beginIndex);
+          default:
+            return createToken(BAR, beginIndex);
+        }
+      case 96:
+        return scanTemplateStart(beginIndex);
+      case 64:
+        return createToken(AT, beginIndex);
+      case 48:
+        return scanPostZero(beginIndex);
+      case 49:
+      case 50:
+      case 51:
+      case 52:
+      case 53:
+      case 54:
+      case 55:
+      case 56:
+      case 57:
+        return scanPostDigit(beginIndex);
+      case 34:
+      case 39:
+        return scanStringLiteral(beginIndex, code);
+      default:
+        return scanIdentifierOrKeyword(beginIndex, code);
+    }
+  }
+  function scanNumberPostPeriod(beginIndex) {
+    skipDecimalDigits();
+    return scanExponentOfNumericLiteral(beginIndex);
+  }
+  function scanPostDigit(beginIndex) {
+    skipDecimalDigits();
+    return scanFractionalNumericLiteral(beginIndex);
+  }
+  function scanPostZero(beginIndex) {
+    switch (currentCharCode) {
+      case 46:
+        return scanFractionalNumericLiteral(beginIndex);
+      case 88:
+      case 120:
+        next();
+        if (!isHexDigit(currentCharCode)) {
+          reportError('Hex Integer Literal must contain at least one digit');
+        }
+        skipHexDigits();
+        return new LiteralToken(NUMBER, getTokenString(beginIndex), getTokenRange(beginIndex));
+      case 66:
+      case 98:
+        if (!parseOptions.numericLiterals)
+          break;
+        next();
+        if (!isBinaryDigit(currentCharCode)) {
+          reportError('Binary Integer Literal must contain at least one digit');
+        }
+        skipBinaryDigits();
+        return new LiteralToken(NUMBER, getTokenString(beginIndex), getTokenRange(beginIndex));
+      case 79:
+      case 111:
+        if (!parseOptions.numericLiterals)
+          break;
+        next();
+        if (!isOctalDigit(currentCharCode)) {
+          reportError('Octal Integer Literal must contain at least one digit');
+        }
+        skipOctalDigits();
+        return new LiteralToken(NUMBER, getTokenString(beginIndex), getTokenRange(beginIndex));
+      case 48:
+      case 49:
+      case 50:
+      case 51:
+      case 52:
+      case 53:
+      case 54:
+      case 55:
+      case 56:
+      case 57:
+        return scanPostDigit(beginIndex);
+    }
+    return new LiteralToken(NUMBER, getTokenString(beginIndex), getTokenRange(beginIndex));
+  }
+  function createToken(type, beginIndex) {
+    return new Token(type, getTokenRange(beginIndex));
+  }
+  function readUnicodeEscapeSequence() {
+    var beginIndex = index;
+    if (currentCharCode === 117) {
+      next();
+      if (skipHexDigit() && skipHexDigit() && skipHexDigit() && skipHexDigit()) {
+        return parseInt(getTokenString(beginIndex + 1), 16);
+      }
+    }
+    reportError('Invalid unicode escape sequence in identifier', beginIndex - 1);
+    return 0;
+  }
+  function scanIdentifierOrKeyword(beginIndex, code) {
+    var escapedCharCodes;
+    if (code === 92) {
+      code = readUnicodeEscapeSequence();
+      escapedCharCodes = [code];
+    }
+    if (!isIdentifierStart(code)) {
+      reportError(("Character code '" + code + "' is not a valid identifier start char"), beginIndex);
+      return createToken(ERROR, beginIndex);
+    }
+    for (; ; ) {
+      code = currentCharCode;
+      if (isIdentifierPart(code)) {
+        next();
+      } else if (code === 92) {
+        next();
+        code = readUnicodeEscapeSequence();
+        if (!escapedCharCodes)
+          escapedCharCodes = [];
+        escapedCharCodes.push(code);
+        if (!isIdentifierPart(code))
+          return createToken(ERROR, beginIndex);
+      } else {
+        break;
+      }
+    }
+    var value = input.slice(beginIndex, index);
+    var keywordType = getKeywordType(value);
+    if (keywordType)
+      return new KeywordToken(value, keywordType, getTokenRange(beginIndex));
+    if (escapedCharCodes) {
+      var i = 0;
+      value = value.replace(/\\u..../g, function(s) {
+        return String.fromCharCode(escapedCharCodes[i++]);
+      });
+    }
+    return new IdentifierToken(getTokenRange(beginIndex), value);
+  }
+  function scanStringLiteral(beginIndex, terminator) {
+    while (peekStringLiteralChar(terminator)) {
+      if (!skipStringLiteralChar()) {
+        return new LiteralToken(STRING, getTokenString(beginIndex), getTokenRange(beginIndex));
+      }
+    }
+    if (currentCharCode !== terminator) {
+      reportError('Unterminated String Literal', beginIndex);
+    } else {
+      next();
+    }
+    return new LiteralToken(STRING, getTokenString(beginIndex), getTokenRange(beginIndex));
+  }
+  function getTokenString(beginIndex) {
+    return input.substring(beginIndex, index);
+  }
+  function peekStringLiteralChar(terminator) {
+    return !isAtEnd() && currentCharCode !== terminator && !isLineTerminator(currentCharCode);
+  }
+  function skipStringLiteralChar() {
+    if (currentCharCode === 92) {
+      return skipStringLiteralEscapeSequence();
+    }
+    next();
+    return true;
+  }
+  function skipStringLiteralEscapeSequence() {
+    next();
+    if (isAtEnd()) {
+      reportError('Unterminated string literal escape sequence');
+      return false;
+    }
+    if (isLineTerminator(currentCharCode)) {
+      skipLineTerminator();
+      return true;
+    }
+    var code = currentCharCode;
+    next();
+    switch (code) {
+      case 39:
+      case 34:
+      case 92:
+      case 98:
+      case 102:
+      case 110:
+      case 114:
+      case 116:
+      case 118:
+      case 48:
+        return true;
+      case 120:
+        return skipHexDigit() && skipHexDigit();
+      case 117:
+        return skipHexDigit() && skipHexDigit() && skipHexDigit() && skipHexDigit();
+      default:
+        return true;
+    }
+  }
+  function skipHexDigit() {
+    if (!isHexDigit(currentCharCode)) {
+      reportError('Hex digit expected');
+      return false;
+    }
+    next();
+    return true;
+  }
+  function skipLineTerminator() {
+    var first = currentCharCode;
+    next();
+    if (first === 13 && currentCharCode === 10) {
+      next();
+    }
+  }
+  function scanFractionalNumericLiteral(beginIndex) {
+    if (currentCharCode === 46) {
+      next();
+      skipDecimalDigits();
+    }
+    return scanExponentOfNumericLiteral(beginIndex);
+  }
+  function scanExponentOfNumericLiteral(beginIndex) {
+    switch (currentCharCode) {
+      case 101:
+      case 69:
+        next();
+        switch (currentCharCode) {
+          case 43:
+          case 45:
+            next();
+            break;
+        }
+        if (!isDecimalDigit(currentCharCode)) {
+          reportError('Exponent part must contain at least one digit');
+        }
+        skipDecimalDigits();
+        break;
+      default:
+        break;
+    }
+    return new LiteralToken(NUMBER, getTokenString(beginIndex), getTokenRange(beginIndex));
+  }
+  function skipDecimalDigits() {
+    while (isDecimalDigit(currentCharCode)) {
+      next();
+    }
+  }
+  function skipHexDigits() {
+    while (isHexDigit(currentCharCode)) {
+      next();
+    }
+  }
+  function skipBinaryDigits() {
+    while (isBinaryDigit(currentCharCode)) {
+      next();
+    }
+  }
+  function skipOctalDigits() {
+    while (isOctalDigit(currentCharCode)) {
+      next();
+    }
+  }
+  function isAtEnd() {
+    return index === length;
+  }
+  function next() {
+    index++;
+    updateCurrentCharCode();
+  }
+  function updateCurrentCharCode() {
+    currentCharCode = input.charCodeAt(index);
+  }
+  function reportError(message) {
+    var indexArg = arguments[1] !== (void 0) ? arguments[1] : index;
+    var position = getPosition(indexArg);
+    errorReporter.reportError(position, message);
+  }
+  return {
+    get isWhitespace() {
+      return isWhitespace;
+    },
+    get isLineTerminator() {
+      return isLineTerminator;
+    },
+    get isIdentifierPart() {
+      return isIdentifierPart;
+    },
+    get Scanner() {
+      return Scanner;
+    }
+  };
+});
+System.register("traceur@0.0.32/src/outputgeneration/ParseTreeWriter", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/outputgeneration/ParseTreeWriter";
+  var $__35 = System.get("traceur@0.0.32/src/syntax/trees/ParseTreeType"),
+      BLOCK = $__35.BLOCK,
+      IF_STATEMENT = $__35.IF_STATEMENT,
+      LITERAL_EXPRESSION = $__35.LITERAL_EXPRESSION,
+      POSTFIX_EXPRESSION = $__35.POSTFIX_EXPRESSION,
+      UNARY_EXPRESSION = $__35.UNARY_EXPRESSION;
+  var ParseTreeVisitor = System.get("traceur@0.0.32/src/syntax/ParseTreeVisitor").ParseTreeVisitor;
+  var $__35 = System.get("traceur@0.0.32/src/syntax/PredefinedName"),
+      AS = $__35.AS,
+      FROM = $__35.FROM,
+      GET = $__35.GET,
+      OF = $__35.OF,
+      MODULE = $__35.MODULE,
+      SET = $__35.SET;
+  var Token = System.get("traceur@0.0.32/src/syntax/Token").Token;
+  var getKeywordType = System.get("traceur@0.0.32/src/syntax/Keywords").getKeywordType;
+  var $__35 = System.get("traceur@0.0.32/src/syntax/Scanner"),
+      isIdentifierPart = $__35.isIdentifierPart,
+      isWhitespace = $__35.isWhitespace;
+  var $__35 = System.get("traceur@0.0.32/src/syntax/TokenType"),
+      AMPERSAND = $__35.AMPERSAND,
+      AMPERSAND_EQUAL = $__35.AMPERSAND_EQUAL,
+      AND = $__35.AND,
+      ARROW = $__35.ARROW,
+      AT = $__35.AT,
+      AWAIT = $__35.AWAIT,
+      BACK_QUOTE = $__35.BACK_QUOTE,
+      BANG = $__35.BANG,
+      BAR = $__35.BAR,
+      BAR_EQUAL = $__35.BAR_EQUAL,
+      BREAK = $__35.BREAK,
+      CARET = $__35.CARET,
+      CARET_EQUAL = $__35.CARET_EQUAL,
+      CASE = $__35.CASE,
+      CATCH = $__35.CATCH,
+      CLASS = $__35.CLASS,
+      CLOSE_ANGLE = $__35.CLOSE_ANGLE,
+      CLOSE_CURLY = $__35.CLOSE_CURLY,
+      CLOSE_PAREN = $__35.CLOSE_PAREN,
+      CLOSE_SQUARE = $__35.CLOSE_SQUARE,
+      COLON = $__35.COLON,
+      COMMA = $__35.COMMA,
+      CONST = $__35.CONST,
+      CONTINUE = $__35.CONTINUE,
+      DEBUGGER = $__35.DEBUGGER,
+      DEFAULT = $__35.DEFAULT,
+      DELETE = $__35.DELETE,
+      DO = $__35.DO,
+      DOT_DOT_DOT = $__35.DOT_DOT_DOT,
+      ELSE = $__35.ELSE,
+      END_OF_FILE = $__35.END_OF_FILE,
+      ENUM = $__35.ENUM,
+      EQUAL = $__35.EQUAL,
+      EQUAL_EQUAL = $__35.EQUAL_EQUAL,
+      EQUAL_EQUAL_EQUAL = $__35.EQUAL_EQUAL_EQUAL,
+      ERROR = $__35.ERROR,
+      EXPORT = $__35.EXPORT,
+      EXTENDS = $__35.EXTENDS,
+      FALSE = $__35.FALSE,
+      FINALLY = $__35.FINALLY,
+      FOR = $__35.FOR,
+      FUNCTION = $__35.FUNCTION,
+      GREATER_EQUAL = $__35.GREATER_EQUAL,
+      IDENTIFIER = $__35.IDENTIFIER,
+      IF = $__35.IF,
+      IMPLEMENTS = $__35.IMPLEMENTS,
+      IMPORT = $__35.IMPORT,
+      IN = $__35.IN,
+      INSTANCEOF = $__35.INSTANCEOF,
+      INTERFACE = $__35.INTERFACE,
+      LEFT_SHIFT = $__35.LEFT_SHIFT,
+      LEFT_SHIFT_EQUAL = $__35.LEFT_SHIFT_EQUAL,
+      LESS_EQUAL = $__35.LESS_EQUAL,
+      LET = $__35.LET,
+      MINUS = $__35.MINUS,
+      MINUS_EQUAL = $__35.MINUS_EQUAL,
+      MINUS_MINUS = $__35.MINUS_MINUS,
+      NEW = $__35.NEW,
+      NO_SUBSTITUTION_TEMPLATE = $__35.NO_SUBSTITUTION_TEMPLATE,
+      NOT_EQUAL = $__35.NOT_EQUAL,
+      NOT_EQUAL_EQUAL = $__35.NOT_EQUAL_EQUAL,
+      NULL = $__35.NULL,
+      NUMBER = $__35.NUMBER,
+      OPEN_ANGLE = $__35.OPEN_ANGLE,
+      OPEN_CURLY = $__35.OPEN_CURLY,
+      OPEN_PAREN = $__35.OPEN_PAREN,
+      OPEN_SQUARE = $__35.OPEN_SQUARE,
+      OR = $__35.OR,
+      PACKAGE = $__35.PACKAGE,
+      PERCENT = $__35.PERCENT,
+      PERCENT_EQUAL = $__35.PERCENT_EQUAL,
+      PERIOD = $__35.PERIOD,
+      PLUS = $__35.PLUS,
+      PLUS_EQUAL = $__35.PLUS_EQUAL,
+      PLUS_PLUS = $__35.PLUS_PLUS,
+      PRIVATE = $__35.PRIVATE,
+      PROTECTED = $__35.PROTECTED,
+      PUBLIC = $__35.PUBLIC,
+      QUESTION = $__35.QUESTION,
+      REGULAR_EXPRESSION = $__35.REGULAR_EXPRESSION,
+      RETURN = $__35.RETURN,
+      RIGHT_SHIFT = $__35.RIGHT_SHIFT,
+      RIGHT_SHIFT_EQUAL = $__35.RIGHT_SHIFT_EQUAL,
+      SEMI_COLON = $__35.SEMI_COLON,
+      SLASH = $__35.SLASH,
+      SLASH_EQUAL = $__35.SLASH_EQUAL,
+      STAR = $__35.STAR,
+      STAR_EQUAL = $__35.STAR_EQUAL,
+      STATIC = $__35.STATIC,
+      STRING = $__35.STRING,
+      SUPER = $__35.SUPER,
+      SWITCH = $__35.SWITCH,
+      TEMPLATE_HEAD = $__35.TEMPLATE_HEAD,
+      TEMPLATE_MIDDLE = $__35.TEMPLATE_MIDDLE,
+      TEMPLATE_TAIL = $__35.TEMPLATE_TAIL,
+      THIS = $__35.THIS,
+      THROW = $__35.THROW,
+      TILDE = $__35.TILDE,
+      TRUE = $__35.TRUE,
+      TRY = $__35.TRY,
+      TYPEOF = $__35.TYPEOF,
+      UNSIGNED_RIGHT_SHIFT = $__35.UNSIGNED_RIGHT_SHIFT,
+      UNSIGNED_RIGHT_SHIFT_EQUAL = $__35.UNSIGNED_RIGHT_SHIFT_EQUAL,
+      VAR = $__35.VAR,
+      VOID = $__35.VOID,
+      WHILE = $__35.WHILE,
+      WITH = $__35.WITH,
+      YIELD = $__35.YIELD;
+  var NEW_LINE = '\n';
+  var LINE_LENGTH = 80;
+  var ParseTreeWriter = function ParseTreeWriter() {
+    var $__35 = arguments[0] !== (void 0) ? arguments[0] : {},
+        highlighted = "highlighted" in $__35 ? $__35.highlighted : false,
+        showLineNumbers = "showLineNumbers" in $__35 ? $__35.showLineNumbers : false,
+        prettyPrint = "prettyPrint" in $__35 ? $__35.prettyPrint : true;
+    $traceurRuntime.superCall(this, $ParseTreeWriter.prototype, "constructor", []);
+    this.highlighted_ = highlighted;
+    this.showLineNumbers_ = showLineNumbers;
+    this.prettyPrint_ = prettyPrint;
+    this.result_ = '';
+    this.currentLine_ = '';
+    this.currentLineComment_ = null;
+    this.indentDepth_ = 0;
+    this.currentParameterTypeAnnotation_ = null;
+  };
+  var $ParseTreeWriter = ParseTreeWriter;
+  ($traceurRuntime.createClass)(ParseTreeWriter, {
+    toString: function() {
+      if (this.currentLine_.length > 0) {
+        this.result_ += this.currentLine_;
+        this.currentLine_ = '';
+      }
+      return this.result_;
+    },
+    visitAny: function(tree) {
+      if (!tree) {
+        return;
+      }
+      if (tree === this.highlighted_) {
+        this.write_('\x1B[41m');
+      }
+      if (tree.location !== null && tree.location.start !== null && this.showLineNumbers_) {
+        var line = tree.location.start.line + 1;
+        var column = tree.location.start.column;
+        this.currentLineComment_ = ("Line: " + line + "." + column);
+      }
+      $traceurRuntime.superCall(this, $ParseTreeWriter.prototype, "visitAny", [tree]);
+      if (tree === this.highlighted_) {
+        this.write_('\x1B[0m');
+      }
+    },
+    visitAnnotation: function(tree) {
+      this.write_(AT);
+      this.visitAny(tree.name);
+      if (tree.args !== null) {
+        this.write_(OPEN_PAREN);
+        this.writeList_(tree.args, COMMA, false);
+        this.write_(CLOSE_PAREN);
+      }
+    },
+    visitArgumentList: function(tree) {
+      this.write_(OPEN_PAREN);
+      this.writeList_(tree.args, COMMA, false);
+      this.write_(CLOSE_PAREN);
+    },
+    visitArrayComprehension: function(tree) {
+      this.write_(OPEN_SQUARE);
+      this.visitList(tree.comprehensionList);
+      this.visitAny(tree.expression);
+      this.write_(CLOSE_SQUARE);
+    },
+    visitArrayLiteralExpression: function(tree) {
+      this.write_(OPEN_SQUARE);
+      this.writeList_(tree.elements, COMMA, false);
+      this.write_(CLOSE_SQUARE);
+    },
+    visitArrayPattern: function(tree) {
+      this.write_(OPEN_SQUARE);
+      this.writeList_(tree.elements, COMMA, false);
+      this.write_(CLOSE_SQUARE);
+    },
+    visitArrowFunctionExpression: function(tree) {
+      this.write_(OPEN_PAREN);
+      this.visitAny(tree.formalParameters);
+      this.write_(CLOSE_PAREN);
+      this.writeSpace_();
+      this.write_(ARROW);
+      this.writeSpace_();
+      this.visitAny(tree.functionBody);
+    },
+    visitAwaitStatement: function(tree) {
+      this.write_(AWAIT);
+      if (tree.identifier !== null) {
+        this.writeSpace_();
+        this.write_(tree.identifier);
+        this.writeSpace_();
+        this.write_(EQUAL);
+      }
+      this.writeSpace_();
+      this.visitAny(tree.expression);
+      this.write_(SEMI_COLON);
+    },
+    visitBinaryOperator: function(tree) {
+      var left = tree.left;
+      this.visitAny(left);
+      var operator = tree.operator;
+      if (left.type === POSTFIX_EXPRESSION && requiresSpaceBetween(left.operator.type, operator.type)) {
+        this.writeRequiredSpace_();
+      } else {
+        this.writeSpace_();
+      }
+      this.write_(operator);
+      var right = tree.right;
+      if (right.type === UNARY_EXPRESSION && requiresSpaceBetween(operator.type, right.operator.type)) {
+        this.writeRequiredSpace_();
+      } else {
+        this.writeSpace_();
+      }
+      this.visitAny(right);
+    },
+    visitBindingElement: function(tree) {
+      var typeAnnotation = this.currentParameterTypeAnnotation_;
+      this.currentParameterTypeAnnotation_ = null;
+      this.visitAny(tree.binding);
+      this.writeTypeAnnotation_(typeAnnotation);
+      if (tree.initialiser) {
+        this.writeSpace_();
+        this.write_(EQUAL);
+        this.writeSpace_();
+        this.visitAny(tree.initialiser);
+      }
+    },
+    visitBindingIdentifier: function(tree) {
+      this.write_(tree.identifierToken);
+    },
+    visitBlock: function(tree) {
+      this.write_(OPEN_CURLY);
+      this.writelnList_(tree.statements);
+      this.write_(CLOSE_CURLY);
+    },
+    visitBreakStatement: function(tree) {
+      this.write_(BREAK);
+      if (tree.name !== null) {
+        this.writeSpace_();
+        this.write_(tree.name);
+      }
+      this.write_(SEMI_COLON);
+    },
+    visitCallExpression: function(tree) {
+      this.visitAny(tree.operand);
+      this.visitAny(tree.args);
+    },
+    visitCaseClause: function(tree) {
+      this.write_(CASE);
+      this.writeSpace_();
+      this.visitAny(tree.expression);
+      this.write_(COLON);
+      this.indentDepth_++;
+      this.writelnList_(tree.statements);
+      this.indentDepth_--;
+    },
+    visitCatch: function(tree) {
+      this.write_(CATCH);
+      this.writeSpace_();
+      this.write_(OPEN_PAREN);
+      this.visitAny(tree.binding);
+      this.write_(CLOSE_PAREN);
+      this.writeSpace_();
+      this.visitAny(tree.catchBody);
+    },
+    visitClassShared_: function(tree) {
+      this.writeAnnotations_(tree.annotations);
+      this.write_(CLASS);
+      this.writeSpace_();
+      this.visitAny(tree.name);
+      if (tree.superClass !== null) {
+        this.writeSpace_();
+        this.write_(EXTENDS);
+        this.writeSpace_();
+        this.visitAny(tree.superClass);
+      }
+      this.writeSpace_();
+      this.write_(OPEN_CURLY);
+      this.writelnList_(tree.elements);
+      this.write_(CLOSE_CURLY);
+    },
+    visitClassDeclaration: function(tree) {
+      this.visitClassShared_(tree);
+    },
+    visitClassExpression: function(tree) {
+      this.visitClassShared_(tree);
+    },
+    visitCommaExpression: function(tree) {
+      this.writeList_(tree.expressions, COMMA, false);
+    },
+    visitComprehensionFor: function(tree) {
+      this.write_(FOR);
+      this.writeSpace_();
+      this.write_(OPEN_PAREN);
+      this.visitAny(tree.left);
+      this.writeSpace_();
+      this.write_(OF);
+      this.writeSpace_();
+      this.visitAny(tree.iterator);
+      this.write_(CLOSE_PAREN);
+      this.writeSpace_();
+    },
+    visitComprehensionIf: function(tree) {
+      this.write_(IF);
+      this.writeSpace_();
+      this.write_(OPEN_PAREN);
+      this.visitAny(tree.expression);
+      this.write_(CLOSE_PAREN);
+      this.writeSpace_();
+    },
+    visitComputedPropertyName: function(tree) {
+      this.write_(OPEN_SQUARE);
+      this.visitAny(tree.expression);
+      this.write_(CLOSE_SQUARE);
+    },
+    visitConditionalExpression: function(tree) {
+      this.visitAny(tree.condition);
+      this.writeSpace_();
+      this.write_(QUESTION);
+      this.writeSpace_();
+      this.visitAny(tree.left);
+      this.writeSpace_();
+      this.write_(COLON);
+      this.writeSpace_();
+      this.visitAny(tree.right);
+    },
+    visitContinueStatement: function(tree) {
+      this.write_(CONTINUE);
+      if (tree.name !== null) {
+        this.writeSpace_();
+        this.write_(tree.name);
+      }
+      this.write_(SEMI_COLON);
+    },
+    visitDebuggerStatement: function(tree) {
+      this.write_(DEBUGGER);
+      this.write_(SEMI_COLON);
+    },
+    visitDefaultClause: function(tree) {
+      this.write_(DEFAULT);
+      this.write_(COLON);
+      this.indentDepth_++;
+      this.writelnList_(tree.statements);
+      this.indentDepth_--;
+    },
+    visitDoWhileStatement: function(tree) {
+      this.write_(DO);
+      this.visitAnyBlockOrIndent_(tree.body);
+      this.writeSpace_();
+      this.write_(WHILE);
+      this.writeSpace_();
+      this.write_(OPEN_PAREN);
+      this.visitAny(tree.condition);
+      this.write_(CLOSE_PAREN);
+      this.write_(SEMI_COLON);
+    },
+    visitEmptyStatement: function(tree) {
+      this.write_(SEMI_COLON);
+    },
+    visitExportDeclaration: function(tree) {
+      this.writeAnnotations_(tree.annotations);
+      this.write_(EXPORT);
+      this.writeSpace_();
+      this.visitAny(tree.declaration);
+    },
+    visitExportDefault: function(tree) {
+      this.write_(DEFAULT);
+      this.writeSpace_();
+      this.visitAny(tree.expression);
+      this.write_(SEMI_COLON);
+    },
+    visitNamedExport: function(tree) {
+      this.visitAny(tree.specifierSet);
+      if (tree.moduleSpecifier) {
+        this.writeSpace_();
+        this.write_(FROM);
+        this.writeSpace_();
+        this.visitAny(tree.moduleSpecifier);
+      }
+      this.write_(SEMI_COLON);
+    },
+    visitExportSpecifier: function(tree) {
+      this.write_(tree.lhs);
+      if (tree.rhs) {
+        this.writeSpace_();
+        this.write_(AS);
+        this.writeSpace_();
+        this.write_(tree.rhs);
+      }
+    },
+    visitExportSpecifierSet: function(tree) {
+      this.write_(OPEN_CURLY);
+      this.writeList_(tree.specifiers, COMMA, false);
+      this.write_(CLOSE_CURLY);
+    },
+    visitExportStar: function(tree) {
+      this.write_(STAR);
+    },
+    visitExpressionStatement: function(tree) {
+      this.visitAny(tree.expression);
+      this.write_(SEMI_COLON);
+    },
+    visitFinally: function(tree) {
+      this.write_(FINALLY);
+      this.writeSpace_();
+      this.visitAny(tree.block);
+    },
+    visitForOfStatement: function(tree) {
+      this.write_(FOR);
+      this.writeSpace_();
+      this.write_(OPEN_PAREN);
+      this.visitAny(tree.initialiser);
+      this.writeSpace_();
+      this.write_(OF);
+      this.writeSpace_();
+      this.visitAny(tree.collection);
+      this.write_(CLOSE_PAREN);
+      this.visitAnyBlockOrIndent_(tree.body);
+    },
+    visitForInStatement: function(tree) {
+      this.write_(FOR);
+      this.writeSpace_();
+      this.write_(OPEN_PAREN);
+      this.visitAny(tree.initialiser);
+      this.writeSpace_();
+      this.write_(IN);
+      this.writeSpace_();
+      this.visitAny(tree.collection);
+      this.write_(CLOSE_PAREN);
+      this.visitAnyBlockOrIndent_(tree.body);
+    },
+    visitForStatement: function(tree) {
+      this.write_(FOR);
+      this.writeSpace_();
+      this.write_(OPEN_PAREN);
+      this.visitAny(tree.initialiser);
+      this.write_(SEMI_COLON);
+      this.writeSpace_();
+      this.visitAny(tree.condition);
+      this.write_(SEMI_COLON);
+      this.writeSpace_();
+      this.visitAny(tree.increment);
+      this.write_(CLOSE_PAREN);
+      this.visitAnyBlockOrIndent_(tree.body);
+    },
+    visitFormalParameterList: function(tree) {
+      var first = true;
+      for (var i = 0; i < tree.parameters.length; i++) {
+        var parameter = tree.parameters[i];
+        if (first) {
+          first = false;
+        } else {
+          this.write_(COMMA);
+          this.writeSpace_();
+        }
+        this.visitAny(parameter);
+      }
+    },
+    visitFormalParameter: function(tree) {
+      this.writeAnnotations_(tree.annotations, false);
+      this.currentParameterTypeAnnotation_ = tree.typeAnnotation;
+      this.visitAny(tree.parameter);
+      this.currentParameterTypeAnnotation_ = null;
+    },
+    visitFunctionBody: function(tree) {
+      this.write_(OPEN_CURLY);
+      this.writelnList_(tree.statements);
+      this.write_(CLOSE_CURLY);
+    },
+    visitFunctionDeclaration: function(tree) {
+      this.visitFunction_(tree);
+    },
+    visitFunctionExpression: function(tree) {
+      this.visitFunction_(tree);
+    },
+    visitFunction_: function(tree) {
+      this.writeAnnotations_(tree.annotations);
+      this.write_(FUNCTION);
+      if (tree.isGenerator)
+        this.write_(STAR);
+      if (tree.name) {
+        this.writeSpace_();
+        this.visitAny(tree.name);
+      }
+      this.write_(OPEN_PAREN);
+      this.visitAny(tree.formalParameterList);
+      this.write_(CLOSE_PAREN);
+      this.writeTypeAnnotation_(tree.typeAnnotation);
+      this.writeSpace_();
+      this.visitAny(tree.functionBody);
+    },
+    visitGeneratorComprehension: function(tree) {
+      this.write_(OPEN_PAREN);
+      this.visitList(tree.comprehensionList);
+      this.visitAny(tree.expression);
+      this.write_(CLOSE_PAREN);
+    },
+    visitGetAccessor: function(tree) {
+      this.writeAnnotations_(tree.annotations);
+      if (tree.isStatic) {
+        this.write_(STATIC);
+        this.writeSpace_();
+      }
+      this.write_(GET);
+      this.writeSpace_();
+      this.visitAny(tree.name);
+      this.write_(OPEN_PAREN);
+      this.write_(CLOSE_PAREN);
+      this.writeSpace_();
+      this.writeTypeAnnotation_(tree.typeAnnotation);
+      this.visitAny(tree.body);
+    },
+    visitIdentifierExpression: function(tree) {
+      this.write_(tree.identifierToken);
+    },
+    visitIfStatement: function(tree) {
+      this.write_(IF);
+      this.writeSpace_();
+      this.write_(OPEN_PAREN);
+      this.visitAny(tree.condition);
+      this.write_(CLOSE_PAREN);
+      this.visitAnyBlockOrIndent_(tree.ifClause);
+      if (tree.elseClause) {
+        if (tree.ifClause.type === BLOCK)
+          this.writeSpace_();
+        this.write_(ELSE);
+        if (tree.elseClause.type === IF_STATEMENT) {
+          this.writeSpace_();
+          this.visitAny(tree.elseClause);
+        } else {
+          this.visitAnyBlockOrIndent_(tree.elseClause);
+        }
+      }
+    },
+    visitAnyBlockOrIndent_: function(tree) {
+      if (tree.type === BLOCK) {
+        this.writeSpace_();
+        this.visitAny(tree);
+      } else {
+        this.visitAnyIndented_(tree);
+      }
+    },
+    visitAnyIndented_: function(tree) {
+      var indent = arguments[1] !== (void 0) ? arguments[1] : 1;
+      if (this.prettyPrint_) {
+        this.indentDepth_ += indent;
+        this.writeln_();
+      }
+      this.visitAny(tree);
+      if (this.prettyPrint_) {
+        this.indentDepth_ -= indent;
+        this.writeln_();
+      }
+    },
+    visitImportDeclaration: function(tree) {
+      this.write_(IMPORT);
+      this.writeSpace_();
+      if (this.importClause) {
+        this.visitAny(tree.importClause);
+        this.writeSpace_();
+        this.write_(FROM);
+        this.writeSpace_();
+      }
+      this.visitAny(tree.moduleSpecifier);
+      this.write_(SEMI_COLON);
+    },
+    visitImportSpecifier: function(tree) {
+      this.write_(tree.lhs);
+      if (tree.rhs !== null) {
+        this.writeSpace_();
+        this.write_(AS);
+        this.writeSpace_();
+        this.write_(tree.rhs);
+      }
+    },
+    visitImportSpecifierSet: function(tree) {
+      if (tree.specifiers.type == STAR) {
+        this.write_(STAR);
+      } else {
+        this.write_(OPEN_CURLY);
+        this.writelnList_(tree.specifiers, COMMA);
+        this.write_(CLOSE_CURLY);
+      }
+    },
+    visitLabelledStatement: function(tree) {
+      this.write_(tree.name);
+      this.write_(COLON);
+      this.writeSpace_();
+      this.visitAny(tree.statement);
+    },
+    visitLiteralExpression: function(tree) {
+      this.write_(tree.literalToken);
+    },
+    visitLiteralPropertyName: function(tree) {
+      this.write_(tree.literalToken);
+    },
+    visitMemberExpression: function(tree) {
+      this.visitAny(tree.operand);
+      if (tree.operand.type === LITERAL_EXPRESSION && tree.operand.literalToken.type === NUMBER) {
+        if (!/\.|e|E/.test(tree.operand.literalToken.value))
+          this.writeRequiredSpace_();
+      }
+      this.write_(PERIOD);
+      this.write_(tree.memberName);
+    },
+    visitMemberLookupExpression: function(tree) {
+      this.visitAny(tree.operand);
+      this.write_(OPEN_SQUARE);
+      this.visitAny(tree.memberExpression);
+      this.write_(CLOSE_SQUARE);
+    },
+    visitSyntaxErrorTree: function(tree) {
+      this.write_('(function() {' + ("throw SyntaxError(" + JSON.stringify(tree.message) + ");") + '})()');
+    },
+    visitModule: function(tree) {
+      this.writelnList_(tree.scriptItemList, null);
+    },
+    visitModuleSpecifier: function(tree) {
+      this.write_(tree.token);
+    },
+    visitModuleDeclaration: function(tree) {
+      this.write_(MODULE);
+      this.writeSpace_();
+      this.write_(tree.identifier);
+      this.writeSpace_();
+      this.write_(FROM);
+      this.writeSpace_();
+      this.visitAny(tree.expression);
+      this.write_(SEMI_COLON);
+    },
+    visitNewExpression: function(tree) {
+      this.write_(NEW);
+      this.writeSpace_();
+      this.visitAny(tree.operand);
+      this.visitAny(tree.args);
+    },
+    visitObjectLiteralExpression: function(tree) {
+      this.write_(OPEN_CURLY);
+      if (tree.propertyNameAndValues.length > 1)
+        this.writeln_();
+      this.writelnList_(tree.propertyNameAndValues, COMMA);
+      if (tree.propertyNameAndValues.length > 1)
+        this.writeln_();
+      this.write_(CLOSE_CURLY);
+    },
+    visitObjectPattern: function(tree) {
+      this.write_(OPEN_CURLY);
+      this.writelnList_(tree.fields, COMMA);
+      this.write_(CLOSE_CURLY);
+    },
+    visitObjectPatternField: function(tree) {
+      this.visitAny(tree.name);
+      if (tree.element !== null) {
+        this.write_(COLON);
+        this.writeSpace_();
+        this.visitAny(tree.element);
+      }
+    },
+    visitParenExpression: function(tree) {
+      this.write_(OPEN_PAREN);
+      $traceurRuntime.superCall(this, $ParseTreeWriter.prototype, "visitParenExpression", [tree]);
+      this.write_(CLOSE_PAREN);
+    },
+    visitPostfixExpression: function(tree) {
+      this.visitAny(tree.operand);
+      if (tree.operand.type === POSTFIX_EXPRESSION && tree.operand.operator.type === tree.operator.type) {
+        this.writeRequiredSpace_();
+      }
+      this.write_(tree.operator);
+    },
+    visitPredefinedType: function(tree) {
+      this.write_(tree.typeToken);
+    },
+    visitScript: function(tree) {
+      this.writelnList_(tree.scriptItemList, null);
+    },
+    visitPropertyMethodAssignment: function(tree) {
+      this.writeAnnotations_(tree.annotations);
+      if (tree.isStatic) {
+        this.write_(STATIC);
+        this.writeSpace_();
+      }
+      if (tree.isGenerator)
+        this.write_(STAR);
+      this.visitAny(tree.name);
+      this.write_(OPEN_PAREN);
+      this.visitAny(tree.formalParameterList);
+      this.write_(CLOSE_PAREN);
+      this.writeSpace_();
+      this.writeTypeAnnotation_(tree.typeAnnotation);
+      this.visitAny(tree.functionBody);
+    },
+    visitPropertyNameAssignment: function(tree) {
+      this.visitAny(tree.name);
+      this.write_(COLON);
+      this.writeSpace_();
+      this.visitAny(tree.value);
+    },
+    visitPropertyNameShorthand: function(tree) {
+      this.write_(tree.name);
+    },
+    visitTemplateLiteralExpression: function(tree) {
+      if (tree.operand) {
+        this.visitAny(tree.operand);
+        this.writeSpace_();
+      }
+      this.writeRaw_(BACK_QUOTE);
+      this.visitList(tree.elements);
+      this.writeRaw_(BACK_QUOTE);
+    },
+    visitTemplateLiteralPortion: function(tree) {
+      this.writeRaw_(tree.value);
+    },
+    visitTemplateSubstitution: function(tree) {
+      this.writeRaw_('$');
+      this.writeRaw_(OPEN_CURLY);
+      this.visitAny(tree.expression);
+      this.writeRaw_(CLOSE_CURLY);
+    },
+    visitReturnStatement: function(tree) {
+      this.write_(RETURN);
+      this.writeSpace_(tree.expression);
+      this.visitAny(tree.expression);
+      this.write_(SEMI_COLON);
+    },
+    visitRestParameter: function(tree) {
+      this.write_(DOT_DOT_DOT);
+      this.write_(tree.identifier.identifierToken);
+      this.writeTypeAnnotation_(this.currentParameterTypeAnnotation_);
+    },
+    visitSetAccessor: function(tree) {
+      this.writeAnnotations_(tree.annotations);
+      if (tree.isStatic) {
+        this.write_(STATIC);
+        this.writeSpace_();
+      }
+      this.write_(SET);
+      this.writeSpace_();
+      this.visitAny(tree.name);
+      this.write_(OPEN_PAREN);
+      this.visitAny(tree.parameter);
+      this.write_(CLOSE_PAREN);
+      this.writeSpace_();
+      this.visitAny(tree.body);
+    },
+    visitSpreadExpression: function(tree) {
+      this.write_(DOT_DOT_DOT);
+      this.visitAny(tree.expression);
+    },
+    visitSpreadPatternElement: function(tree) {
+      this.write_(DOT_DOT_DOT);
+      this.visitAny(tree.lvalue);
+    },
+    visitStateMachine: function(tree) {
+      throw new Error('State machines cannot be converted to source');
+    },
+    visitSuperExpression: function(tree) {
+      this.write_(SUPER);
+    },
+    visitSwitchStatement: function(tree) {
+      this.write_(SWITCH);
+      this.writeSpace_();
+      this.write_(OPEN_PAREN);
+      this.visitAny(tree.expression);
+      this.write_(CLOSE_PAREN);
+      this.writeSpace_();
+      this.write_(OPEN_CURLY);
+      this.writelnList_(tree.caseClauses);
+      this.write_(CLOSE_CURLY);
+    },
+    visitThisExpression: function(tree) {
+      this.write_(THIS);
+    },
+    visitThrowStatement: function(tree) {
+      this.write_(THROW);
+      this.writeSpace_();
+      this.visitAny(tree.value);
+      this.write_(SEMI_COLON);
+    },
+    visitTryStatement: function(tree) {
+      this.write_(TRY);
+      this.writeSpace_();
+      this.visitAny(tree.body);
+      if (tree.catchBlock) {
+        this.writeSpace_();
+        this.visitAny(tree.catchBlock);
+      }
+      if (tree.finallyBlock) {
+        this.writeSpace_();
+        this.visitAny(tree.finallyBlock);
+      }
+    },
+    visitTypeName: function(tree) {
+      if (tree.moduleName) {
+        this.visitAny(tree.moduleName);
+        this.write_(PERIOD);
+      }
+      this.write_(tree.name);
+    },
+    visitUnaryExpression: function(tree) {
+      var op = tree.operator;
+      this.write_(op);
+      var operand = tree.operand;
+      if (operand.type === UNARY_EXPRESSION && requiresSpaceBetween(op.type, operand.operator.type)) {
+        this.writeRequiredSpace_();
+      }
+      this.visitAny(operand);
+    },
+    visitVariableDeclarationList: function(tree) {
+      this.write_(tree.declarationType);
+      this.writeSpace_();
+      this.writeList_(tree.declarations, COMMA, true, 2);
+    },
+    visitVariableDeclaration: function(tree) {
+      this.visitAny(tree.lvalue);
+      this.writeTypeAnnotation_(tree.typeAnnotation);
+      if (tree.initialiser !== null) {
+        this.writeSpace_();
+        this.write_(EQUAL);
+        this.writeSpace_();
+        this.visitAny(tree.initialiser);
+      }
+    },
+    visitVariableStatement: function(tree) {
+      $traceurRuntime.superCall(this, $ParseTreeWriter.prototype, "visitVariableStatement", [tree]);
+      this.write_(SEMI_COLON);
+    },
+    visitWhileStatement: function(tree) {
+      this.write_(WHILE);
+      this.writeSpace_();
+      this.write_(OPEN_PAREN);
+      this.visitAny(tree.condition);
+      this.write_(CLOSE_PAREN);
+      this.visitAnyBlockOrIndent_(tree.body);
+    },
+    visitWithStatement: function(tree) {
+      this.write_(WITH);
+      this.writeSpace_();
+      this.write_(OPEN_PAREN);
+      this.visitAny(tree.expression);
+      this.write_(CLOSE_PAREN);
+      this.writeSpace_();
+      this.visitAny(tree.body);
+    },
+    visitYieldExpression: function(tree) {
+      this.write_(YIELD);
+      if (tree.isYieldFor)
+        this.write_(STAR);
+      if (tree.expression) {
+        this.writeSpace_();
+        this.visitAny(tree.expression);
+      }
+    },
+    writeCurrentln_: function() {
+      this.result_ += this.currentLine_ + NEW_LINE;
+    },
+    writeln_: function() {
+      if (this.currentLineComment_) {
+        while (this.currentLine_.length < LINE_LENGTH) {
+          this.currentLine_ += ' ';
+        }
+        this.currentLine_ += ' // ' + this.currentLineComment_;
+        this.currentLineComment_ = null;
+      }
+      if (this.currentLine_)
+        this.writeCurrentln_();
+      this.currentLine_ = '';
+    },
+    writelnList_: function(list, delimiter) {
+      if (delimiter) {
+        this.writeList_(list, delimiter, true);
+      } else {
+        if (list.length > 0)
+          this.writeln_();
+        this.writeList_(list, null, true);
+        if (list.length > 0)
+          this.writeln_();
+      }
+    },
+    writeList_: function(list, delimiter, writeNewLine) {
+      var indent = arguments[3] !== (void 0) ? arguments[3] : 0;
+      var first = true;
+      for (var i = 0; i < list.length; i++) {
+        var element = list[i];
+        if (first) {
+          first = false;
+        } else {
+          if (delimiter !== null) {
+            this.write_(delimiter);
+            if (!writeNewLine)
+              this.writeSpace_();
+          }
+          if (writeNewLine) {
+            if (i === 1)
+              this.indentDepth_ += indent;
+            this.writeln_();
+          }
+        }
+        this.visitAny(element);
+      }
+      if (writeNewLine && list.length > 1)
+        this.indentDepth_ -= indent;
+    },
+    writeRaw_: function(value) {
+      this.currentLine_ += value;
+    },
+    write_: function(value) {
+      if (value === CLOSE_CURLY)
+        this.indentDepth_--;
+      if (value !== null) {
+        if (this.prettyPrint_) {
+          if (!this.currentLine_) {
+            for (var i = 0,
+                indent = this.indentDepth_; i < indent; i++) {
+              this.currentLine_ += '  ';
+            }
+          }
+        }
+        if (this.needsSpace_(value))
+          this.currentLine_ += ' ';
+        this.currentLine_ += value;
+      }
+      if (value === OPEN_CURLY)
+        this.indentDepth_++;
+    },
+    writeSpace_: function() {
+      var useSpace = arguments[0] !== (void 0) ? arguments[0] : this.prettyPrint_;
+      if (useSpace && !endsWithSpace(this.currentLine_))
+        this.currentLine_ += ' ';
+    },
+    writeRequiredSpace_: function() {
+      this.writeSpace_(true);
+    },
+    writeTypeAnnotation_: function(typeAnnotation) {
+      if (typeAnnotation !== null) {
+        this.write_(COLON);
+        this.writeSpace_();
+        this.visitAny(typeAnnotation);
+      }
+    },
+    writeAnnotations_: function(annotations) {
+      var writeNewLine = arguments[1] !== (void 0) ? arguments[1] : this.prettyPrint_;
+      if (annotations.length > 0) {
+        this.writeList_(annotations, null, writeNewLine);
+        if (writeNewLine)
+          this.writeln_();
+      }
+    },
+    needsSpace_: function(token) {
+      var line = this.currentLine_;
+      if (!line)
+        return false;
+      var lastCode = line.charCodeAt(line.length - 1);
+      if (isWhitespace(lastCode))
+        return false;
+      var firstCode = token.toString().charCodeAt(0);
+      return isIdentifierPart(firstCode) && (isIdentifierPart(lastCode) || lastCode === 47);
+    }
+  }, {}, ParseTreeVisitor);
+  function requiresSpaceBetween(first, second) {
+    return (first === MINUS || first === MINUS_MINUS) && (second === MINUS || second === MINUS_MINUS) || (first === PLUS || first === PLUS_PLUS) && (second === PLUS || second === PLUS_PLUS);
+  }
+  function endsWithSpace(s) {
+    return isWhitespace(s.charCodeAt(s.length - 1));
+  }
+  return {get ParseTreeWriter() {
+      return ParseTreeWriter;
+    }};
+});
+System.register("traceur@0.0.32/src/outputgeneration/ParseTreeMapWriter", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/outputgeneration/ParseTreeMapWriter";
+  var ParseTreeWriter = System.get("traceur@0.0.32/src/outputgeneration/ParseTreeWriter").ParseTreeWriter;
+  var ParseTreeMapWriter = function ParseTreeMapWriter(sourceMapGenerator) {
+    var options = arguments[1];
+    $traceurRuntime.superCall(this, $ParseTreeMapWriter.prototype, "constructor", [options]);
+    this.sourceMapGenerator_ = sourceMapGenerator;
+    this.outputLineCount_ = 1;
+    this.isFirstMapping_ = true;
+  };
+  var $ParseTreeMapWriter = ParseTreeMapWriter;
+  ($traceurRuntime.createClass)(ParseTreeMapWriter, {
+    visitAny: function(tree) {
+      if (!tree) {
+        return;
+      }
+      if (tree.location)
+        this.enterBranch(tree.location);
+      $traceurRuntime.superCall(this, $ParseTreeMapWriter.prototype, "visitAny", [tree]);
+      if (tree.location)
+        this.exitBranch(tree.location);
+    },
+    writeCurrentln_: function() {
+      $traceurRuntime.superCall(this, $ParseTreeMapWriter.prototype, "writeCurrentln_", []);
+      this.flushMappings();
+      this.outputLineCount_++;
+      this.generated_ = {
+        line: this.outputLineCount_,
+        column: 1
+      };
+      this.flushMappings();
+    },
+    write_: function(value) {
+      if (this.entered_) {
+        this.generate();
+        $traceurRuntime.superCall(this, $ParseTreeMapWriter.prototype, "write_", [value]);
+        this.generate();
+      } else {
+        this.generate();
+        $traceurRuntime.superCall(this, $ParseTreeMapWriter.prototype, "write_", [value]);
+        this.generate();
+      }
+    },
+    generate: function() {
+      this.generated_ = {
+        line: this.outputLineCount_,
+        column: this.currentLine_.length
+      };
+      this.flushMappings();
+    },
+    enterBranch: function(location) {
+      this.originate(location.start);
+      this.entered_ = true;
+    },
+    exitBranch: function(location) {
+      this.originate(location.end);
+      this.entered_ = false;
+    },
+    originate: function(position) {
+      var line = position.line + 1;
+      if (this.original_ && this.original_.line !== line)
+        this.flushMappings();
+      this.original_ = {
+        line: line,
+        column: position.column || 0
+      };
+      if (position.source.name !== this.sourceName_) {
+        this.sourceName_ = position.source.name;
+        this.sourceMapGenerator_.setSourceContent(position.source.name, position.source.contents);
+      }
+      this.flushMappings();
+    },
+    flushMappings: function() {
+      if (this.original_ && this.generated_) {
+        this.addMapping();
+        this.original_ = null;
+        this.generated_ = null;
+      }
+    },
+    isSame: function(lhs, rhs) {
+      return lhs.line === rhs.line && lhs.column === rhs.column;
+    },
+    isSameMapping: function() {
+      if (!this.previousMapping_)
+        return false;
+      if (this.isSame(this.previousMapping_.generated, this.generated_) && this.isSame(this.previousMapping_.original, this.original_))
+        return true;
+      ;
+    },
+    addMapping: function() {
+      if (this.isSameMapping())
+        return;
+      var mapping = {
+        generated: this.generated_,
+        original: this.original_,
+        source: this.sourceName_
+      };
+      this.sourceMapGenerator_.addMapping(mapping);
+      this.previousMapping_ = mapping;
+    }
+  }, {}, ParseTreeWriter);
+  return {get ParseTreeMapWriter() {
+      return ParseTreeMapWriter;
+    }};
+});
+System.register("traceur@0.0.32/src/outputgeneration/SourceMapIntegration", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/outputgeneration/SourceMapIntegration";
+  function makeDefine(mapping, id) {
+    var require = function(id) {
+      return mapping[id];
+    };
+    var exports = mapping[id] = {};
+    var module = null;
+    return function(factory) {
+      factory(require, exports, module);
+    };
+  }
+  var define,
+      m = {};
+  define = makeDefine(m, './util');
+  if (typeof define !== 'function') {
+    var define = require('amdefine')(module, require);
+  }
+  define(function(require, exports, module) {
+    function getArg(aArgs, aName, aDefaultValue) {
+      if (aName in aArgs) {
+        return aArgs[aName];
+      } else if (arguments.length === 3) {
+        return aDefaultValue;
+      } else {
+        throw new Error('"' + aName + '" is a required argument.');
+      }
+    }
+    exports.getArg = getArg;
+    var urlRegexp = /([\w+\-.]+):\/\/((\w+:\w+)@)?([\w.]+)?(:(\d+))?(\S+)?/;
+    var dataUrlRegexp = /^data:.+\,.+/;
+    function urlParse(aUrl) {
+      var match = aUrl.match(urlRegexp);
+      if (!match) {
+        return null;
+      }
+      return {
+        scheme: match[1],
+        auth: match[3],
+        host: match[4],
+        port: match[6],
+        path: match[7]
+      };
+    }
+    exports.urlParse = urlParse;
+    function urlGenerate(aParsedUrl) {
+      var url = aParsedUrl.scheme + "://";
+      if (aParsedUrl.auth) {
+        url += aParsedUrl.auth + "@";
+      }
+      if (aParsedUrl.host) {
+        url += aParsedUrl.host;
+      }
+      if (aParsedUrl.port) {
+        url += ":" + aParsedUrl.port;
+      }
+      if (aParsedUrl.path) {
+        url += aParsedUrl.path;
+      }
+      return url;
+    }
+    exports.urlGenerate = urlGenerate;
+    function join(aRoot, aPath) {
+      var url;
+      if (aPath.match(urlRegexp) || aPath.match(dataUrlRegexp)) {
+        return aPath;
+      }
+      if (aPath.charAt(0) === '/' && (url = urlParse(aRoot))) {
+        url.path = aPath;
+        return urlGenerate(url);
+      }
+      return aRoot.replace(/\/$/, '') + '/' + aPath;
+    }
+    exports.join = join;
+    function toSetString(aStr) {
+      return '$' + aStr;
+    }
+    exports.toSetString = toSetString;
+    function fromSetString(aStr) {
+      return aStr.substr(1);
+    }
+    exports.fromSetString = fromSetString;
+    function relative(aRoot, aPath) {
+      aRoot = aRoot.replace(/\/$/, '');
+      var url = urlParse(aRoot);
+      if (aPath.charAt(0) == "/" && url && url.path == "/") {
+        return aPath.slice(1);
+      }
+      return aPath.indexOf(aRoot + '/') === 0 ? aPath.substr(aRoot.length + 1) : aPath;
+    }
+    exports.relative = relative;
+    function strcmp(aStr1, aStr2) {
+      var s1 = aStr1 || "";
+      var s2 = aStr2 || "";
+      return (s1 > s2) - (s1 < s2);
+    }
+    function compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) {
+      var cmp;
+      cmp = strcmp(mappingA.source, mappingB.source);
+      if (cmp) {
+        return cmp;
+      }
+      cmp = mappingA.originalLine - mappingB.originalLine;
+      if (cmp) {
+        return cmp;
+      }
+      cmp = mappingA.originalColumn - mappingB.originalColumn;
+      if (cmp || onlyCompareOriginal) {
+        return cmp;
+      }
+      cmp = strcmp(mappingA.name, mappingB.name);
+      if (cmp) {
+        return cmp;
+      }
+      cmp = mappingA.generatedLine - mappingB.generatedLine;
+      if (cmp) {
+        return cmp;
+      }
+      return mappingA.generatedColumn - mappingB.generatedColumn;
+    }
+    ;
+    exports.compareByOriginalPositions = compareByOriginalPositions;
+    function compareByGeneratedPositions(mappingA, mappingB, onlyCompareGenerated) {
+      var cmp;
+      cmp = mappingA.generatedLine - mappingB.generatedLine;
+      if (cmp) {
+        return cmp;
+      }
+      cmp = mappingA.generatedColumn - mappingB.generatedColumn;
+      if (cmp || onlyCompareGenerated) {
+        return cmp;
+      }
+      cmp = strcmp(mappingA.source, mappingB.source);
+      if (cmp) {
+        return cmp;
+      }
+      cmp = mappingA.originalLine - mappingB.originalLine;
+      if (cmp) {
+        return cmp;
+      }
+      cmp = mappingA.originalColumn - mappingB.originalColumn;
+      if (cmp) {
+        return cmp;
+      }
+      return strcmp(mappingA.name, mappingB.name);
+    }
+    ;
+    exports.compareByGeneratedPositions = compareByGeneratedPositions;
+  });
+  define = makeDefine(m, './array-set');
+  if (typeof define !== 'function') {
+    var define = require('amdefine')(module, require);
+  }
+  define(function(require, exports, module) {
+    var util = require('./util');
+    function ArraySet() {
+      this._array = [];
+      this._set = {};
+    }
+    ArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) {
+      var set = new ArraySet();
+      for (var i = 0,
+          len = aArray.length; i < len; i++) {
+        set.add(aArray[i], aAllowDuplicates);
+      }
+      return set;
+    };
+    ArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) {
+      var isDuplicate = this.has(aStr);
+      var idx = this._array.length;
+      if (!isDuplicate || aAllowDuplicates) {
+        this._array.push(aStr);
+      }
+      if (!isDuplicate) {
+        this._set[util.toSetString(aStr)] = idx;
+      }
+    };
+    ArraySet.prototype.has = function ArraySet_has(aStr) {
+      return Object.prototype.hasOwnProperty.call(this._set, util.toSetString(aStr));
+    };
+    ArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) {
+      if (this.has(aStr)) {
+        return this._set[util.toSetString(aStr)];
+      }
+      throw new Error('"' + aStr + '" is not in the set.');
+    };
+    ArraySet.prototype.at = function ArraySet_at(aIdx) {
+      if (aIdx >= 0 && aIdx < this._array.length) {
+        return this._array[aIdx];
+      }
+      throw new Error('No element indexed by ' + aIdx);
+    };
+    ArraySet.prototype.toArray = function ArraySet_toArray() {
+      return this._array.slice();
+    };
+    exports.ArraySet = ArraySet;
+  });
+  define = makeDefine(m, './base64');
+  if (typeof define !== 'function') {
+    var define = require('amdefine')(module, require);
+  }
+  define(function(require, exports, module) {
+    var charToIntMap = {};
+    var intToCharMap = {};
+    'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('').forEach(function(ch, index) {
+      charToIntMap[ch] = index;
+      intToCharMap[index] = ch;
+    });
+    exports.encode = function base64_encode(aNumber) {
+      if (aNumber in intToCharMap) {
+        return intToCharMap[aNumber];
+      }
+      throw new TypeError("Must be between 0 and 63: " + aNumber);
+    };
+    exports.decode = function base64_decode(aChar) {
+      if (aChar in charToIntMap) {
+        return charToIntMap[aChar];
+      }
+      throw new TypeError("Not a valid base 64 digit: " + aChar);
+    };
+  });
+  define = makeDefine(m, './base64-vlq');
+  if (typeof define !== 'function') {
+    var define = require('amdefine')(module, require);
+  }
+  define(function(require, exports, module) {
+    var base64 = require('./base64');
+    var VLQ_BASE_SHIFT = 5;
+    var VLQ_BASE = 1 << VLQ_BASE_SHIFT;
+    var VLQ_BASE_MASK = VLQ_BASE - 1;
+    var VLQ_CONTINUATION_BIT = VLQ_BASE;
+    function toVLQSigned(aValue) {
+      return aValue < 0 ? ((-aValue) << 1) + 1 : (aValue << 1) + 0;
+    }
+    function fromVLQSigned(aValue) {
+      var isNegative = (aValue & 1) === 1;
+      var shifted = aValue >> 1;
+      return isNegative ? -shifted : shifted;
+    }
+    exports.encode = function base64VLQ_encode(aValue) {
+      var encoded = "";
+      var digit;
+      var vlq = toVLQSigned(aValue);
+      do {
+        digit = vlq & VLQ_BASE_MASK;
+        vlq >>>= VLQ_BASE_SHIFT;
+        if (vlq > 0) {
+          digit |= VLQ_CONTINUATION_BIT;
+        }
+        encoded += base64.encode(digit);
+      } while (vlq > 0);
+      return encoded;
+    };
+    exports.decode = function base64VLQ_decode(aStr) {
+      var i = 0;
+      var strLen = aStr.length;
+      var result = 0;
+      var shift = 0;
+      var continuation,
+          digit;
+      do {
+        if (i >= strLen) {
+          throw new Error("Expected more digits in base 64 VLQ value.");
+        }
+        digit = base64.decode(aStr.charAt(i++));
+        continuation = !!(digit & VLQ_CONTINUATION_BIT);
+        digit &= VLQ_BASE_MASK;
+        result = result + (digit << shift);
+        shift += VLQ_BASE_SHIFT;
+      } while (continuation);
+      return {
+        value: fromVLQSigned(result),
+        rest: aStr.slice(i)
+      };
+    };
+  });
+  define = makeDefine(m, './binary-search');
+  if (typeof define !== 'function') {
+    var define = require('amdefine')(module, require);
+  }
+  define(function(require, exports, module) {
+    function recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare) {
+      var mid = Math.floor((aHigh - aLow) / 2) + aLow;
+      var cmp = aCompare(aNeedle, aHaystack[mid], true);
+      if (cmp === 0) {
+        return aHaystack[mid];
+      } else if (cmp > 0) {
+        if (aHigh - mid > 1) {
+          return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare);
+        }
+        return aHaystack[mid];
+      } else {
+        if (mid - aLow > 1) {
+          return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare);
+        }
+        return aLow < 0 ? null : aHaystack[aLow];
+      }
+    }
+    exports.search = function search(aNeedle, aHaystack, aCompare) {
+      return aHaystack.length > 0 ? recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack, aCompare) : null;
+    };
+  });
+  define = makeDefine(m, './source-map-generator');
+  if (typeof define !== 'function') {
+    var define = require('amdefine')(module, require);
+  }
+  define(function(require, exports, module) {
+    var base64VLQ = require('./base64-vlq');
+    var util = require('./util');
+    var ArraySet = require('./array-set').ArraySet;
+    function SourceMapGenerator(aArgs) {
+      this._file = util.getArg(aArgs, 'file');
+      this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null);
+      this._sources = new ArraySet();
+      this._names = new ArraySet();
+      this._mappings = [];
+      this._sourcesContents = null;
+    }
+    SourceMapGenerator.prototype._version = 3;
+    SourceMapGenerator.fromSourceMap = function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) {
+      var sourceRoot = aSourceMapConsumer.sourceRoot;
+      var generator = new SourceMapGenerator({
+        file: aSourceMapConsumer.file,
+        sourceRoot: sourceRoot
+      });
+      aSourceMapConsumer.eachMapping(function(mapping) {
+        var newMapping = {generated: {
+            line: mapping.generatedLine,
+            column: mapping.generatedColumn
+          }};
+        if (mapping.source) {
+          newMapping.source = mapping.source;
+          if (sourceRoot) {
+            newMapping.source = util.relative(sourceRoot, newMapping.source);
+          }
+          newMapping.original = {
+            line: mapping.originalLine,
+            column: mapping.originalColumn
+          };
+          if (mapping.name) {
+            newMapping.name = mapping.name;
+          }
+        }
+        generator.addMapping(newMapping);
+      });
+      aSourceMapConsumer.sources.forEach(function(sourceFile) {
+        var content = aSourceMapConsumer.sourceContentFor(sourceFile);
+        if (content) {
+          generator.setSourceContent(sourceFile, content);
+        }
+      });
+      return generator;
+    };
+    SourceMapGenerator.prototype.addMapping = function SourceMapGenerator_addMapping(aArgs) {
+      var generated = util.getArg(aArgs, 'generated');
+      var original = util.getArg(aArgs, 'original', null);
+      var source = util.getArg(aArgs, 'source', null);
+      var name = util.getArg(aArgs, 'name', null);
+      this._validateMapping(generated, original, source, name);
+      if (source && !this._sources.has(source)) {
+        this._sources.add(source);
+      }
+      if (name && !this._names.has(name)) {
+        this._names.add(name);
+      }
+      this._mappings.push({
+        generatedLine: generated.line,
+        generatedColumn: generated.column,
+        originalLine: original != null && original.line,
+        originalColumn: original != null && original.column,
+        source: source,
+        name: name
+      });
+    };
+    SourceMapGenerator.prototype.setSourceContent = function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) {
+      var source = aSourceFile;
+      if (this._sourceRoot) {
+        source = util.relative(this._sourceRoot, source);
+      }
+      if (aSourceContent !== null) {
+        if (!this._sourcesContents) {
+          this._sourcesContents = {};
+        }
+        this._sourcesContents[util.toSetString(source)] = aSourceContent;
+      } else {
+        delete this._sourcesContents[util.toSetString(source)];
+        if (Object.keys(this._sourcesContents).length === 0) {
+          this._sourcesContents = null;
+        }
+      }
+    };
+    SourceMapGenerator.prototype.applySourceMap = function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile) {
+      if (!aSourceFile) {
+        aSourceFile = aSourceMapConsumer.file;
+      }
+      var sourceRoot = this._sourceRoot;
+      if (sourceRoot) {
+        aSourceFile = util.relative(sourceRoot, aSourceFile);
+      }
+      var newSources = new ArraySet();
+      var newNames = new ArraySet();
+      this._mappings.forEach(function(mapping) {
+        if (mapping.source === aSourceFile && mapping.originalLine) {
+          var original = aSourceMapConsumer.originalPositionFor({
+            line: mapping.originalLine,
+            column: mapping.originalColumn
+          });
+          if (original.source !== null) {
+            if (sourceRoot) {
+              mapping.source = util.relative(sourceRoot, original.source);
+            } else {
+              mapping.source = original.source;
+            }
+            mapping.originalLine = original.line;
+            mapping.originalColumn = original.column;
+            if (original.name !== null && mapping.name !== null) {
+              mapping.name = original.name;
+            }
+          }
+        }
+        var source = mapping.source;
+        if (source && !newSources.has(source)) {
+          newSources.add(source);
+        }
+        var name = mapping.name;
+        if (name && !newNames.has(name)) {
+          newNames.add(name);
+        }
+      }, this);
+      this._sources = newSources;
+      this._names = newNames;
+      aSourceMapConsumer.sources.forEach(function(sourceFile) {
+        var content = aSourceMapConsumer.sourceContentFor(sourceFile);
+        if (content) {
+          if (sourceRoot) {
+            sourceFile = util.relative(sourceRoot, sourceFile);
+          }
+          this.setSourceContent(sourceFile, content);
+        }
+      }, this);
+    };
+    SourceMapGenerator.prototype._validateMapping = function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource, aName) {
+      if (aGenerated && 'line' in aGenerated && 'column' in aGenerated && aGenerated.line > 0 && aGenerated.column >= 0 && !aOriginal && !aSource && !aName) {
+        return;
+      } else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated && aOriginal && 'line' in aOriginal && 'column' in aOriginal && aGenerated.line > 0 && aGenerated.column >= 0 && aOriginal.line > 0 && aOriginal.column >= 0 && aSource) {
+        return;
+      } else {
+        throw new Error('Invalid mapping: ' + JSON.stringify({
+          generated: aGenerated,
+          source: aSource,
+          orginal: aOriginal,
+          name: aName
+        }));
+      }
+    };
+    SourceMapGenerator.prototype._serializeMappings = function SourceMapGenerator_serializeMappings() {
+      var previousGeneratedColumn = 0;
+      var previousGeneratedLine = 1;
+      var previousOriginalColumn = 0;
+      var previousOriginalLine = 0;
+      var previousName = 0;
+      var previousSource = 0;
+      var result = '';
+      var mapping;
+      this._mappings.sort(util.compareByGeneratedPositions);
+      for (var i = 0,
+          len = this._mappings.length; i < len; i++) {
+        mapping = this._mappings[i];
+        if (mapping.generatedLine !== previousGeneratedLine) {
+          previousGeneratedColumn = 0;
+          while (mapping.generatedLine !== previousGeneratedLine) {
+            result += ';';
+            previousGeneratedLine++;
+          }
+        } else {
+          if (i > 0) {
+            if (!util.compareByGeneratedPositions(mapping, this._mappings[i - 1])) {
+              continue;
+            }
+            result += ',';
+          }
+        }
+        result += base64VLQ.encode(mapping.generatedColumn - previousGeneratedColumn);
+        previousGeneratedColumn = mapping.generatedColumn;
+        if (mapping.source) {
+          result += base64VLQ.encode(this._sources.indexOf(mapping.source) - previousSource);
+          previousSource = this._sources.indexOf(mapping.source);
+          result += base64VLQ.encode(mapping.originalLine - 1 - previousOriginalLine);
+          previousOriginalLine = mapping.originalLine - 1;
+          result += base64VLQ.encode(mapping.originalColumn - previousOriginalColumn);
+          previousOriginalColumn = mapping.originalColumn;
+          if (mapping.name) {
+            result += base64VLQ.encode(this._names.indexOf(mapping.name) - previousName);
+            previousName = this._names.indexOf(mapping.name);
+          }
+        }
+      }
+      return result;
+    };
+    SourceMapGenerator.prototype._generateSourcesContent = function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) {
+      return aSources.map(function(source) {
+        if (!this._sourcesContents) {
+          return null;
+        }
+        if (aSourceRoot) {
+          source = util.relative(aSourceRoot, source);
+        }
+        var key = util.toSetString(source);
+        return Object.prototype.hasOwnProperty.call(this._sourcesContents, key) ? this._sourcesContents[key] : null;
+      }, this);
+    };
+    SourceMapGenerator.prototype.toJSON = function SourceMapGenerator_toJSON() {
+      var map = {
+        version: this._version,
+        file: this._file,
+        sources: this._sources.toArray(),
+        names: this._names.toArray(),
+        mappings: this._serializeMappings()
+      };
+      if (this._sourceRoot) {
+        map.sourceRoot = this._sourceRoot;
+      }
+      if (this._sourcesContents) {
+        map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot);
+      }
+      return map;
+    };
+    SourceMapGenerator.prototype.toString = function SourceMapGenerator_toString() {
+      return JSON.stringify(this);
+    };
+    exports.SourceMapGenerator = SourceMapGenerator;
+  });
+  define = makeDefine(m, './source-map-consumer');
+  if (typeof define !== 'function') {
+    var define = require('amdefine')(module, require);
+  }
+  define(function(require, exports, module) {
+    var util = require('./util');
+    var binarySearch = require('./binary-search');
+    var ArraySet = require('./array-set').ArraySet;
+    var base64VLQ = require('./base64-vlq');
+    function SourceMapConsumer(aSourceMap) {
+      var sourceMap = aSourceMap;
+      if (typeof aSourceMap === 'string') {
+        sourceMap = JSON.parse(aSourceMap.replace(/^\)\]\}'/, ''));
+      }
+      var version = util.getArg(sourceMap, 'version');
+      var sources = util.getArg(sourceMap, 'sources');
+      var names = util.getArg(sourceMap, 'names');
+      var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null);
+      var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null);
+      var mappings = util.getArg(sourceMap, 'mappings');
+      var file = util.getArg(sourceMap, 'file', null);
+      if (version !== this._version) {
+        throw new Error('Unsupported version: ' + version);
+      }
+      this._names = ArraySet.fromArray(names, true);
+      this._sources = ArraySet.fromArray(sources, true);
+      this.sourceRoot = sourceRoot;
+      this.sourcesContent = sourcesContent;
+      this.file = file;
+      this._generatedMappings = [];
+      this._originalMappings = [];
+      this._parseMappings(mappings, sourceRoot);
+    }
+    SourceMapConsumer.fromSourceMap = function SourceMapConsumer_fromSourceMap(aSourceMap) {
+      var smc = Object.create(SourceMapConsumer.prototype);
+      smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true);
+      smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true);
+      smc.sourceRoot = aSourceMap._sourceRoot;
+      smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(), smc.sourceRoot);
+      smc.file = aSourceMap._file;
+      smc._generatedMappings = aSourceMap._mappings.slice().sort(util.compareByGeneratedPositions);
+      smc._originalMappings = aSourceMap._mappings.slice().sort(util.compareByOriginalPositions);
+      return smc;
+    };
+    SourceMapConsumer.prototype._version = 3;
+    Object.defineProperty(SourceMapConsumer.prototype, 'sources', {get: function() {
+        return this._sources.toArray().map(function(s) {
+          return this.sourceRoot ? util.join(this.sourceRoot, s) : s;
+        }, this);
+      }});
+    SourceMapConsumer.prototype._parseMappings = function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {
+      var generatedLine = 1;
+      var previousGeneratedColumn = 0;
+      var previousOriginalLine = 0;
+      var previousOriginalColumn = 0;
+      var previousSource = 0;
+      var previousName = 0;
+      var mappingSeparator = /^[,;]/;
+      var str = aStr;
+      var mapping;
+      var temp;
+      while (str.length > 0) {
+        if (str.charAt(0) === ';') {
+          generatedLine++;
+          str = str.slice(1);
+          previousGeneratedColumn = 0;
+        } else if (str.charAt(0) === ',') {
+          str = str.slice(1);
+        } else {
+          mapping = {};
+          mapping.generatedLine = generatedLine;
+          temp = base64VLQ.decode(str);
+          mapping.generatedColumn = previousGeneratedColumn + temp.value;
+          previousGeneratedColumn = mapping.generatedColumn;
+          str = temp.rest;
+          if (str.length > 0 && !mappingSeparator.test(str.charAt(0))) {
+            temp = base64VLQ.decode(str);
+            mapping.source = this._sources.at(previousSource + temp.value);
+            previousSource += temp.value;
+            str = temp.rest;
+            if (str.length === 0 || mappingSeparator.test(str.charAt(0))) {
+              throw new Error('Found a source, but no line and column');
+            }
+            temp = base64VLQ.decode(str);
+            mapping.originalLine = previousOriginalLine + temp.value;
+            previousOriginalLine = mapping.originalLine;
+            mapping.originalLine += 1;
+            str = temp.rest;
+            if (str.length === 0 || mappingSeparator.test(str.charAt(0))) {
+              throw new Error('Found a source and line, but no column');
+            }
+            temp = base64VLQ.decode(str);
+            mapping.originalColumn = previousOriginalColumn + temp.value;
+            previousOriginalColumn = mapping.originalColumn;
+            str = temp.rest;
+            if (str.length > 0 && !mappingSeparator.test(str.charAt(0))) {
+              temp = base64VLQ.decode(str);
+              mapping.name = this._names.at(previousName + temp.value);
+              previousName += temp.value;
+              str = temp.rest;
+            }
+          }
+          this._generatedMappings.push(mapping);
+          if (typeof mapping.originalLine === 'number') {
+            this._originalMappings.push(mapping);
+          }
+        }
+      }
+      this._originalMappings.sort(util.compareByOriginalPositions);
+    };
+    SourceMapConsumer.prototype._findMapping = function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName, aColumnName, aComparator) {
+      if (aNeedle[aLineName] <= 0) {
+        throw new TypeError('Line must be greater than or equal to 1, got ' + aNeedle[aLineName]);
+      }
+      if (aNeedle[aColumnName] < 0) {
+        throw new TypeError('Column must be greater than or equal to 0, got ' + aNeedle[aColumnName]);
+      }
+      return binarySearch.search(aNeedle, aMappings, aComparator);
+    };
+    SourceMapConsumer.prototype.originalPositionFor = function SourceMapConsumer_originalPositionFor(aArgs) {
+      var needle = {
+        generatedLine: util.getArg(aArgs, 'line'),
+        generatedColumn: util.getArg(aArgs, 'column')
+      };
+      var mapping = this._findMapping(needle, this._generatedMappings, "generatedLine", "generatedColumn", util.compareByGeneratedPositions);
+      if (mapping) {
+        var source = util.getArg(mapping, 'source', null);
+        if (source && this.sourceRoot) {
+          source = util.join(this.sourceRoot, source);
+        }
+        return {
+          source: source,
+          line: util.getArg(mapping, 'originalLine', null),
+          column: util.getArg(mapping, 'originalColumn', null),
+          name: util.getArg(mapping, 'name', null)
+        };
+      }
+      return {
+        source: null,
+        line: null,
+        column: null,
+        name: null
+      };
+    };
+    SourceMapConsumer.prototype.sourceContentFor = function SourceMapConsumer_sourceContentFor(aSource) {
+      if (!this.sourcesContent) {
+        return null;
+      }
+      if (this.sourceRoot) {
+        aSource = util.relative(this.sourceRoot, aSource);
+      }
+      if (this._sources.has(aSource)) {
+        return this.sourcesContent[this._sources.indexOf(aSource)];
+      }
+      var url;
+      if (this.sourceRoot && (url = util.urlParse(this.sourceRoot))) {
+        var fileUriAbsPath = aSource.replace(/^file:\/\//, "");
+        if (url.scheme == "file" && this._sources.has(fileUriAbsPath)) {
+          return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)];
+        }
+        if ((!url.path || url.path == "/") && this._sources.has("/" + aSource)) {
+          return this.sourcesContent[this._sources.indexOf("/" + aSource)];
+        }
+      }
+      throw new Error('"' + aSource + '" is not in the SourceMap.');
+    };
+    SourceMapConsumer.prototype.generatedPositionFor = function SourceMapConsumer_generatedPositionFor(aArgs) {
+      var needle = {
+        source: util.getArg(aArgs, 'source'),
+        originalLine: util.getArg(aArgs, 'line'),
+        originalColumn: util.getArg(aArgs, 'column')
+      };
+      if (this.sourceRoot) {
+        needle.source = util.relative(this.sourceRoot, needle.source);
+      }
+      var mapping = this._findMapping(needle, this._originalMappings, "originalLine", "originalColumn", util.compareByOriginalPositions);
+      if (mapping) {
+        return {
+          line: util.getArg(mapping, 'generatedLine', null),
+          column: util.getArg(mapping, 'generatedColumn', null)
+        };
+      }
+      return {
+        line: null,
+        column: null
+      };
+    };
+    SourceMapConsumer.GENERATED_ORDER = 1;
+    SourceMapConsumer.ORIGINAL_ORDER = 2;
+    SourceMapConsumer.prototype.eachMapping = function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) {
+      var context = aContext || null;
+      var order = aOrder || SourceMapConsumer.GENERATED_ORDER;
+      var mappings;
+      switch (order) {
+        case SourceMapConsumer.GENERATED_ORDER:
+          mappings = this._generatedMappings;
+          break;
+        case SourceMapConsumer.ORIGINAL_ORDER:
+          mappings = this._originalMappings;
+          break;
+        default:
+          throw new Error("Unknown order of iteration.");
+      }
+      var sourceRoot = this.sourceRoot;
+      mappings.map(function(mapping) {
+        var source = mapping.source;
+        if (source && sourceRoot) {
+          source = util.join(sourceRoot, source);
+        }
+        return {
+          source: source,
+          generatedLine: mapping.generatedLine,
+          generatedColumn: mapping.generatedColumn,
+          originalLine: mapping.originalLine,
+          originalColumn: mapping.originalColumn,
+          name: mapping.name
+        };
+      }).forEach(aCallback, context);
+    };
+    exports.SourceMapConsumer = SourceMapConsumer;
+  });
+  define = makeDefine(m, './source-node');
+  if (typeof define !== 'function') {
+    var define = require('amdefine')(module, require);
+  }
+  define(function(require, exports, module) {
+    var SourceMapGenerator = require('./source-map-generator').SourceMapGenerator;
+    var util = require('./util');
+    function SourceNode(aLine, aColumn, aSource, aChunks, aName) {
+      this.children = [];
+      this.sourceContents = {};
+      this.line = aLine === undefined ? null : aLine;
+      this.column = aColumn === undefined ? null : aColumn;
+      this.source = aSource === undefined ? null : aSource;
+      this.name = aName === undefined ? null : aName;
+      if (aChunks != null)
+        this.add(aChunks);
+    }
+    SourceNode.fromStringWithSourceMap = function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer) {
+      var node = new SourceNode();
+      var remainingLines = aGeneratedCode.split('\n');
+      var lastGeneratedLine = 1,
+          lastGeneratedColumn = 0;
+      var lastMapping = null;
+      aSourceMapConsumer.eachMapping(function(mapping) {
+        if (lastMapping === null) {
+          while (lastGeneratedLine < mapping.generatedLine) {
+            node.add(remainingLines.shift() + "\n");
+            lastGeneratedLine++;
+          }
+          if (lastGeneratedColumn < mapping.generatedColumn) {
+            var nextLine = remainingLines[0];
+            node.add(nextLine.substr(0, mapping.generatedColumn));
+            remainingLines[0] = nextLine.substr(mapping.generatedColumn);
+            lastGeneratedColumn = mapping.generatedColumn;
+          }
+        } else {
+          if (lastGeneratedLine < mapping.generatedLine) {
+            var code = "";
+            do {
+              code += remainingLines.shift() + "\n";
+              lastGeneratedLine++;
+              lastGeneratedColumn = 0;
+            } while (lastGeneratedLine < mapping.generatedLine);
+            if (lastGeneratedColumn < mapping.generatedColumn) {
+              var nextLine = remainingLines[0];
+              code += nextLine.substr(0, mapping.generatedColumn);
+              remainingLines[0] = nextLine.substr(mapping.generatedColumn);
+              lastGeneratedColumn = mapping.generatedColumn;
+            }
+            addMappingWithCode(lastMapping, code);
+          } else {
+            var nextLine = remainingLines[0];
+            var code = nextLine.substr(0, mapping.generatedColumn - lastGeneratedColumn);
+            remainingLines[0] = nextLine.substr(mapping.generatedColumn - lastGeneratedColumn);
+            lastGeneratedColumn = mapping.generatedColumn;
+            addMappingWithCode(lastMapping, code);
+          }
+        }
+        lastMapping = mapping;
+      }, this);
+      addMappingWithCode(lastMapping, remainingLines.join("\n"));
+      aSourceMapConsumer.sources.forEach(function(sourceFile) {
+        var content = aSourceMapConsumer.sourceContentFor(sourceFile);
+        if (content) {
+          node.setSourceContent(sourceFile, content);
+        }
+      });
+      return node;
+      function addMappingWithCode(mapping, code) {
+        if (mapping === null || mapping.source === undefined) {
+          node.add(code);
+        } else {
+          node.add(new SourceNode(mapping.originalLine, mapping.originalColumn, mapping.source, code, mapping.name));
+        }
+      }
+    };
+    SourceNode.prototype.add = function SourceNode_add(aChunk) {
+      if (Array.isArray(aChunk)) {
+        aChunk.forEach(function(chunk) {
+          this.add(chunk);
+        }, this);
+      } else if (aChunk instanceof SourceNode || typeof aChunk === "string") {
+        if (aChunk) {
+          this.children.push(aChunk);
+        }
+      } else {
+        throw new TypeError("Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk);
+      }
+      return this;
+    };
+    SourceNode.prototype.prepend = function SourceNode_prepend(aChunk) {
+      if (Array.isArray(aChunk)) {
+        for (var i = aChunk.length - 1; i >= 0; i--) {
+          this.prepend(aChunk[i]);
+        }
+      } else if (aChunk instanceof SourceNode || typeof aChunk === "string") {
+        this.children.unshift(aChunk);
+      } else {
+        throw new TypeError("Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk);
+      }
+      return this;
+    };
+    SourceNode.prototype.walk = function SourceNode_walk(aFn) {
+      var chunk;
+      for (var i = 0,
+          len = this.children.length; i < len; i++) {
+        chunk = this.children[i];
+        if (chunk instanceof SourceNode) {
+          chunk.walk(aFn);
+        } else {
+          if (chunk !== '') {
+            aFn(chunk, {
+              source: this.source,
+              line: this.line,
+              column: this.column,
+              name: this.name
+            });
+          }
+        }
+      }
+    };
+    SourceNode.prototype.join = function SourceNode_join(aSep) {
+      var newChildren;
+      var i;
+      var len = this.children.length;
+      if (len > 0) {
+        newChildren = [];
+        for (i = 0; i < len - 1; i++) {
+          newChildren.push(this.children[i]);
+          newChildren.push(aSep);
+        }
+        newChildren.push(this.children[i]);
+        this.children = newChildren;
+      }
+      return this;
+    };
+    SourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) {
+      var lastChild = this.children[this.children.length - 1];
+      if (lastChild instanceof SourceNode) {
+        lastChild.replaceRight(aPattern, aReplacement);
+      } else if (typeof lastChild === 'string') {
+        this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement);
+      } else {
+        this.children.push(''.replace(aPattern, aReplacement));
+      }
+      return this;
+    };
+    SourceNode.prototype.setSourceContent = function SourceNode_setSourceContent(aSourceFile, aSourceContent) {
+      this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent;
+    };
+    SourceNode.prototype.walkSourceContents = function SourceNode_walkSourceContents(aFn) {
+      for (var i = 0,
+          len = this.children.length; i < len; i++) {
+        if (this.children[i] instanceof SourceNode) {
+          this.children[i].walkSourceContents(aFn);
+        }
+      }
+      var sources = Object.keys(this.sourceContents);
+      for (var i = 0,
+          len = sources.length; i < len; i++) {
+        aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]);
+      }
+    };
+    SourceNode.prototype.toString = function SourceNode_toString() {
+      var str = "";
+      this.walk(function(chunk) {
+        str += chunk;
+      });
+      return str;
+    };
+    SourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) {
+      var generated = {
+        code: "",
+        line: 1,
+        column: 0
+      };
+      var map = new SourceMapGenerator(aArgs);
+      var sourceMappingActive = false;
+      var lastOriginalSource = null;
+      var lastOriginalLine = null;
+      var lastOriginalColumn = null;
+      var lastOriginalName = null;
+      this.walk(function(chunk, original) {
+        generated.code += chunk;
+        if (original.source !== null && original.line !== null && original.column !== null) {
+          if (lastOriginalSource !== original.source || lastOriginalLine !== original.line || lastOriginalColumn !== original.column || lastOriginalName !== original.name) {
+            map.addMapping({
+              source: original.source,
+              original: {
+                line: original.line,
+                column: original.column
+              },
+              generated: {
+                line: generated.line,
+                column: generated.column
+              },
+              name: original.name
+            });
+          }
+          lastOriginalSource = original.source;
+          lastOriginalLine = original.line;
+          lastOriginalColumn = original.column;
+          lastOriginalName = original.name;
+          sourceMappingActive = true;
+        } else if (sourceMappingActive) {
+          map.addMapping({generated: {
+              line: generated.line,
+              column: generated.column
+            }});
+          lastOriginalSource = null;
+          sourceMappingActive = false;
+        }
+        chunk.split('').forEach(function(ch) {
+          if (ch === '\n') {
+            generated.line++;
+            generated.column = 0;
+          } else {
+            generated.column++;
+          }
+        });
+      });
+      this.walkSourceContents(function(sourceFile, sourceContent) {
+        map.setSourceContent(sourceFile, sourceContent);
+      });
+      return {
+        code: generated.code,
+        map: map
+      };
+    };
+    exports.SourceNode = SourceNode;
+  });
+  var SourceMapGenerator = m['./source-map-generator'].SourceMapGenerator;
+  var SourceMapConsumer = m['./source-map-consumer'].SourceMapConsumer;
+  var SourceNode = m['./source-node'].SourceNode;
+  return {
+    get SourceMapGenerator() {
+      return SourceMapGenerator;
+    },
+    get SourceMapConsumer() {
+      return SourceMapConsumer;
+    },
+    get SourceNode() {
+      return SourceNode;
+    }
+  };
+});
+System.register("traceur@0.0.32/src/outputgeneration/toSource", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/outputgeneration/toSource";
+  var ParseTreeMapWriter = System.get("traceur@0.0.32/src/outputgeneration/ParseTreeMapWriter").ParseTreeMapWriter;
+  var ParseTreeWriter = System.get("traceur@0.0.32/src/outputgeneration/ParseTreeWriter").ParseTreeWriter;
+  var SourceMapGenerator = System.get("traceur@0.0.32/src/outputgeneration/SourceMapIntegration").SourceMapGenerator;
+  function toSource(tree) {
+    var options = arguments[1];
+    var sourceMapGenerator = options && options.sourceMapGenerator;
+    if (!sourceMapGenerator && options && options.sourceMaps) {
+      sourceMapGenerator = new SourceMapGenerator({
+        file: options.filename,
+        sourceRoot: null
+      });
+    }
+    var writer;
+    if (sourceMapGenerator)
+      writer = new ParseTreeMapWriter(sourceMapGenerator, options);
+    else
+      writer = new ParseTreeWriter(options);
+    writer.visitAny(tree);
+    return [writer.toString(), sourceMapGenerator && sourceMapGenerator.toString()];
+  }
+  return {get toSource() {
+      return toSource;
+    }};
+});
+System.register("traceur@0.0.32/src/outputgeneration/TreeWriter", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/outputgeneration/TreeWriter";
+  var toSource = System.get("traceur@0.0.32/src/outputgeneration/toSource").toSource;
+  function write(tree) {
+    var options = arguments[1];
+    var $__39 = toSource(tree, options),
+        result = $__39[0],
+        sourceMap = $__39[1];
+    if (sourceMap)
+      options.sourceMap = sourceMap;
+    return result;
+  }
+  var TreeWriter = function TreeWriter() {};
+  ($traceurRuntime.createClass)(TreeWriter, {}, {});
+  TreeWriter.write = write;
+  return {
+    get write() {
+      return write;
+    },
+    get TreeWriter() {
+      return TreeWriter;
+    }
+  };
+});
+System.register("traceur@0.0.32/src/util/assert", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/util/assert";
+  var options = System.get("traceur@0.0.32/src/options").options;
+  function assert(b) {
+    if (!b && options.debug)
+      throw Error('Assertion failed');
+  }
+  return {get assert() {
+      return assert;
+    }};
+});
+System.register("traceur@0.0.32/src/syntax/ParseTreeValidator", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/syntax/ParseTreeValidator";
+  var NewExpression = System.get("traceur@0.0.32/src/syntax/trees/ParseTrees").NewExpression;
+  var ParseTreeVisitor = System.get("traceur@0.0.32/src/syntax/ParseTreeVisitor").ParseTreeVisitor;
+  var TreeWriter = System.get("traceur@0.0.32/src/outputgeneration/TreeWriter").TreeWriter;
+  var $__42 = System.get("traceur@0.0.32/src/syntax/TokenType"),
+      AMPERSAND = $__42.AMPERSAND,
+      AMPERSAND_EQUAL = $__42.AMPERSAND_EQUAL,
+      AND = $__42.AND,
+      BAR = $__42.BAR,
+      BAR_EQUAL = $__42.BAR_EQUAL,
+      CARET = $__42.CARET,
+      CARET_EQUAL = $__42.CARET_EQUAL,
+      CLOSE_ANGLE = $__42.CLOSE_ANGLE,
+      EQUAL = $__42.EQUAL,
+      EQUAL_EQUAL = $__42.EQUAL_EQUAL,
+      EQUAL_EQUAL_EQUAL = $__42.EQUAL_EQUAL_EQUAL,
+      GREATER_EQUAL = $__42.GREATER_EQUAL,
+      IDENTIFIER = $__42.IDENTIFIER,
+      IN = $__42.IN,
+      INSTANCEOF = $__42.INSTANCEOF,
+      LEFT_SHIFT = $__42.LEFT_SHIFT,
+      LEFT_SHIFT_EQUAL = $__42.LEFT_SHIFT_EQUAL,
+      LESS_EQUAL = $__42.LESS_EQUAL,
+      MINUS = $__42.MINUS,
+      MINUS_EQUAL = $__42.MINUS_EQUAL,
+      NOT_EQUAL = $__42.NOT_EQUAL,
+      NOT_EQUAL_EQUAL = $__42.NOT_EQUAL_EQUAL,
+      NUMBER = $__42.NUMBER,
+      OPEN_ANGLE = $__42.OPEN_ANGLE,
+      OR = $__42.OR,
+      PERCENT = $__42.PERCENT,
+      PERCENT_EQUAL = $__42.PERCENT_EQUAL,
+      PLUS = $__42.PLUS,
+      PLUS_EQUAL = $__42.PLUS_EQUAL,
+      RIGHT_SHIFT = $__42.RIGHT_SHIFT,
+      RIGHT_SHIFT_EQUAL = $__42.RIGHT_SHIFT_EQUAL,
+      SLASH = $__42.SLASH,
+      SLASH_EQUAL = $__42.SLASH_EQUAL,
+      STAR = $__42.STAR,
+      STAR_EQUAL = $__42.STAR_EQUAL,
+      STRING = $__42.STRING,
+      UNSIGNED_RIGHT_SHIFT = $__42.UNSIGNED_RIGHT_SHIFT,
+      UNSIGNED_RIGHT_SHIFT_EQUAL = $__42.UNSIGNED_RIGHT_SHIFT_EQUAL;
+  var $__42 = System.get("traceur@0.0.32/src/syntax/trees/ParseTreeType"),
+      ARRAY_PATTERN = $__42.ARRAY_PATTERN,
+      BINDING_ELEMENT = $__42.BINDING_ELEMENT,
+      BINDING_IDENTIFIER = $__42.BINDING_IDENTIFIER,
+      BLOCK = $__42.BLOCK,
+      CASE_CLAUSE = $__42.CASE_CLAUSE,
+      CATCH = $__42.CATCH,
+      CLASS_DECLARATION = $__42.CLASS_DECLARATION,
+      COMPUTED_PROPERTY_NAME = $__42.COMPUTED_PROPERTY_NAME,
+      DEFAULT_CLAUSE = $__42.DEFAULT_CLAUSE,
+      EXPORT_DECLARATION = $__42.EXPORT_DECLARATION,
+      EXPORT_DEFAULT = $__42.EXPORT_DEFAULT,
+      EXPORT_SPECIFIER = $__42.EXPORT_SPECIFIER,
+      EXPORT_SPECIFIER_SET = $__42.EXPORT_SPECIFIER_SET,
+      EXPORT_STAR = $__42.EXPORT_STAR,
+      FINALLY = $__42.FINALLY,
+      FORMAL_PARAMETER = $__42.FORMAL_PARAMETER,
+      FORMAL_PARAMETER_LIST = $__42.FORMAL_PARAMETER_LIST,
+      FUNCTION_BODY = $__42.FUNCTION_BODY,
+      FUNCTION_DECLARATION = $__42.FUNCTION_DECLARATION,
+      GET_ACCESSOR = $__42.GET_ACCESSOR,
+      IDENTIFIER_EXPRESSION = $__42.IDENTIFIER_EXPRESSION,
+      IMPORT_DECLARATION = $__42.IMPORT_DECLARATION,
+      LITERAL_PROPERTY_NAME = $__42.LITERAL_PROPERTY_NAME,
+      MODULE_DECLARATION = $__42.MODULE_DECLARATION,
+      MODULE_SPECIFIER = $__42.MODULE_SPECIFIER,
+      NAMED_EXPORT = $__42.NAMED_EXPORT,
+      OBJECT_PATTERN = $__42.OBJECT_PATTERN,
+      OBJECT_PATTERN_FIELD = $__42.OBJECT_PATTERN_FIELD,
+      PROPERTY_METHOD_ASSIGNMENT = $__42.PROPERTY_METHOD_ASSIGNMENT,
+      PROPERTY_NAME_ASSIGNMENT = $__42.PROPERTY_NAME_ASSIGNMENT,
+      PROPERTY_NAME_SHORTHAND = $__42.PROPERTY_NAME_SHORTHAND,
+      REST_PARAMETER = $__42.REST_PARAMETER,
+      SET_ACCESSOR = $__42.SET_ACCESSOR,
+      TEMPLATE_LITERAL_PORTION = $__42.TEMPLATE_LITERAL_PORTION,
+      TEMPLATE_SUBSTITUTION = $__42.TEMPLATE_SUBSTITUTION,
+      VARIABLE_DECLARATION_LIST = $__42.VARIABLE_DECLARATION_LIST,
+      VARIABLE_STATEMENT = $__42.VARIABLE_STATEMENT;
+  var assert = System.get("traceur@0.0.32/src/util/assert").assert;
+  var ValidationError = function ValidationError(tree, message) {
+    this.tree = tree;
+    this.message = message;
+  };
+  ($traceurRuntime.createClass)(ValidationError, {}, {}, Error);
+  var ParseTreeValidator = function ParseTreeValidator() {
+    $traceurRuntime.defaultSuperCall(this, $ParseTreeValidator.prototype, arguments);
+  };
+  var $ParseTreeValidator = ParseTreeValidator;
+  ($traceurRuntime.createClass)(ParseTreeValidator, {
+    fail_: function(tree, message) {
+      throw new ValidationError(tree, message);
+    },
+    check_: function(condition, tree, message) {
+      if (!condition) {
+        this.fail_(tree, message);
+      }
+    },
+    checkVisit_: function(condition, tree, message) {
+      this.check_(condition, tree, message);
+      this.visitAny(tree);
+    },
+    checkType_: function(type, tree, message) {
+      this.checkVisit_(tree.type === type, tree, message);
+    },
+    visitArgumentList: function(tree) {
+      for (var i = 0; i < tree.args.length; i++) {
+        var argument = tree.args[i];
+        this.checkVisit_(argument.isAssignmentOrSpread(), argument, 'assignment or spread expected');
+      }
+    },
+    visitArrayLiteralExpression: function(tree) {
+      for (var i = 0; i < tree.elements.length; i++) {
+        var element = tree.elements[i];
+        this.checkVisit_(element === null || element.isAssignmentOrSpread(), element, 'assignment or spread expected');
+      }
+    },
+    visitArrayPattern: function(tree) {
+      for (var i = 0; i < tree.elements.length; i++) {
+        var element = tree.elements[i];
+        this.checkVisit_(element === null || element.type === BINDING_ELEMENT || element.type == IDENTIFIER_EXPRESSION || element.isLeftHandSideExpression() || element.isPattern() || element.isSpreadPatternElement(), element, 'null, sub pattern, left hand side expression or spread expected');
+        if (element && element.isSpreadPatternElement()) {
+          this.check_(i === (tree.elements.length - 1), element, 'spread in array patterns must be the last element');
+        }
+      }
+    },
+    visitAwaitStatement: function(tree) {
+      this.checkVisit_(tree.expression.isExpression(), tree.expression, 'await must be expression');
+    },
+    visitBinaryOperator: function(tree) {
+      switch (tree.operator.type) {
+        case EQUAL:
+        case STAR_EQUAL:
+        case SLASH_EQUAL:
+        case PERCENT_EQUAL:
+        case PLUS_EQUAL:
+        case MINUS_EQUAL:
+        case LEFT_SHIFT_EQUAL:
+        case RIGHT_SHIFT_EQUAL:
+        case UNSIGNED_RIGHT_SHIFT_EQUAL:
+        case AMPERSAND_EQUAL:
+        case CARET_EQUAL:
+        case BAR_EQUAL:
+          this.check_(tree.left.isLeftHandSideExpression() || tree.left.isPattern(), tree.left, 'left hand side expression or pattern expected');
+          this.check_(tree.right.isArrowFunctionExpression(), tree.right, 'assignment expression expected');
+          break;
+        case AND:
+        case OR:
+        case BAR:
+        case CARET:
+        case AMPERSAND:
+        case EQUAL_EQUAL:
+        case NOT_EQUAL:
+        case EQUAL_EQUAL_EQUAL:
+        case NOT_EQUAL_EQUAL:
+        case OPEN_ANGLE:
+        case CLOSE_ANGLE:
+        case GREATER_EQUAL:
+        case LESS_EQUAL:
+        case INSTANCEOF:
+        case IN:
+        case LEFT_SHIFT:
+        case RIGHT_SHIFT:
+        case UNSIGNED_RIGHT_SHIFT:
+        case PLUS:
+        case MINUS:
+        case STAR:
+        case SLASH:
+        case PERCENT:
+          this.check_(tree.left.isArrowFunctionExpression(), tree.left, 'assignment expression expected');
+          this.check_(tree.right.isArrowFunctionExpression(), tree.right, 'assignment expression expected');
+          break;
+        default:
+          this.fail_(tree, 'unexpected binary operator');
+      }
+      this.visitAny(tree.left);
+      this.visitAny(tree.right);
+    },
+    visitBindingElement: function(tree) {
+      var binding = tree.binding;
+      this.checkVisit_(binding.type == BINDING_IDENTIFIER || binding.type == OBJECT_PATTERN || binding.type == ARRAY_PATTERN, binding, 'expected valid binding element');
+      this.visitAny(tree.initialiser);
+    },
+    visitBlock: function(tree) {
+      for (var i = 0; i < tree.statements.length; i++) {
+        var statement = tree.statements[i];
+        this.checkVisit_(statement.isStatementListItem(), statement, 'statement or function declaration expected');
+      }
+    },
+    visitCallExpression: function(tree) {
+      this.check_(tree.operand.isMemberExpression(), tree.operand, 'member expression expected');
+      if (tree.operand instanceof NewExpression) {
+        this.check_(tree.operand.args !== null, tree.operand, 'new args expected');
+      }
+      this.visitAny(tree.operand);
+      this.visitAny(tree.args);
+    },
+    visitCaseClause: function(tree) {
+      this.checkVisit_(tree.expression.isExpression(), tree.expression, 'expression expected');
+      for (var i = 0; i < tree.statements.length; i++) {
+        var statement = tree.statements[i];
+        this.checkVisit_(statement.isStatement(), statement, 'statement expected');
+      }
+    },
+    visitCatch: function(tree) {
+      this.checkVisit_(tree.binding.isPattern() || tree.binding.type == BINDING_IDENTIFIER, tree.binding, 'binding identifier expected');
+      this.checkVisit_(tree.catchBody.type === BLOCK, tree.catchBody, 'block expected');
+    },
+    visitClassDeclaration: function(tree) {
+      for (var i = 0; i < tree.elements.length; i++) {
+        var element = tree.elements[i];
+        switch (element.type) {
+          case GET_ACCESSOR:
+          case SET_ACCESSOR:
+          case PROPERTY_METHOD_ASSIGNMENT:
+            break;
+          default:
+            this.fail_(element, 'class element expected');
+        }
+        this.visitAny(element);
+      }
+    },
+    visitCommaExpression: function(tree) {
+      for (var i = 0; i < tree.expressions.length; i++) {
+        var expression = tree.expressions[i];
+        this.checkVisit_(expression.isArrowFunctionExpression(), expression, 'expression expected');
+      }
+    },
+    visitConditionalExpression: function(tree) {
+      this.checkVisit_(tree.condition.isArrowFunctionExpression(), tree.condition, 'expression expected');
+      this.checkVisit_(tree.left.isArrowFunctionExpression(), tree.left, 'expression expected');
+      this.checkVisit_(tree.right.isArrowFunctionExpression(), tree.right, 'expression expected');
+    },
+    visitCoverFormals: function(tree) {
+      this.fail_(tree, 'CoverFormals should have been removed');
+    },
+    visitCoverInitialisedName: function(tree) {
+      this.fail_(tree, 'CoverInitialisedName should have been removed');
+    },
+    visitDefaultClause: function(tree) {
+      for (var i = 0; i < tree.statements.length; i++) {
+        var statement = tree.statements[i];
+        this.checkVisit_(statement.isStatement(), statement, 'statement expected');
+      }
+    },
+    visitDoWhileStatement: function(tree) {
+      this.checkVisit_(tree.body.isStatement(), tree.body, 'statement expected');
+      this.checkVisit_(tree.condition.isExpression(), tree.condition, 'expression expected');
+    },
+    visitExportDeclaration: function(tree) {
+      var declType = tree.declaration.type;
+      this.checkVisit_(declType == VARIABLE_STATEMENT || declType == FUNCTION_DECLARATION || declType == MODULE_DECLARATION || declType == CLASS_DECLARATION || declType == NAMED_EXPORT || declType == EXPORT_DEFAULT, tree.declaration, 'expected valid export tree');
+    },
+    visitNamedExport: function(tree) {
+      if (tree.moduleSpecifier) {
+        this.checkVisit_(tree.moduleSpecifier.type == MODULE_SPECIFIER, tree.moduleSpecifier, 'module expression expected');
+      }
+      var specifierType = tree.specifierSet.type;
+      this.checkVisit_(specifierType == EXPORT_SPECIFIER_SET || specifierType == EXPORT_STAR, tree.specifierSet, 'specifier set or identifier expected');
+    },
+    visitExportSpecifierSet: function(tree) {
+      this.check_(tree.specifiers.length > 0, tree, 'expected at least one identifier');
+      for (var i = 0; i < tree.specifiers.length; i++) {
+        var specifier = tree.specifiers[i];
+        this.checkVisit_(specifier.type == EXPORT_SPECIFIER || specifier.type == IDENTIFIER_EXPRESSION, specifier, 'expected valid export specifier');
+      }
+    },
+    visitExpressionStatement: function(tree) {
+      this.checkVisit_(tree.expression.isExpression(), tree.expression, 'expression expected');
+    },
+    visitFinally: function(tree) {
+      this.checkVisit_(tree.block.type === BLOCK, tree.block, 'block expected');
+    },
+    visitForOfStatement: function(tree) {
+      this.checkVisit_(tree.initialiser.isPattern() || tree.initialiser.type === IDENTIFIER_EXPRESSION || tree.initialiser.type === VARIABLE_DECLARATION_LIST && tree.initialiser.declarations.length === 1, tree.initialiser, 'for-each statement may not have more than one variable declaration');
+      this.checkVisit_(tree.collection.isExpression(), tree.collection, 'expression expected');
+      this.checkVisit_(tree.body.isStatement(), tree.body, 'statement expected');
+    },
+    visitForInStatement: function(tree) {
+      if (tree.initialiser.type === VARIABLE_DECLARATION_LIST) {
+        this.checkVisit_(tree.initialiser.declarations.length <= 1, tree.initialiser, 'for-in statement may not have more than one variable declaration');
+      } else {
+        this.checkVisit_(tree.initialiser.isPattern() || tree.initialiser.isExpression(), tree.initialiser, 'variable declaration, expression or ' + 'pattern expected');
+      }
+      this.checkVisit_(tree.collection.isExpression(), tree.collection, 'expression expected');
+      this.checkVisit_(tree.body.isStatement(), tree.body, 'statement expected');
+    },
+    visitFormalParameterList: function(tree) {
+      for (var i = 0; i < tree.parameters.length; i++) {
+        var parameter = tree.parameters[i];
+        assert(parameter.type === FORMAL_PARAMETER);
+        parameter = parameter.parameter;
+        switch (parameter.type) {
+          case BINDING_ELEMENT:
+            break;
+          case REST_PARAMETER:
+            this.checkVisit_(i === tree.parameters.length - 1, parameter, 'rest parameters must be the last parameter in a parameter list');
+            this.checkType_(BINDING_IDENTIFIER, parameter.identifier, 'binding identifier expected');
+            break;
+          default:
+            this.fail_(parameter, 'parameters must be identifiers or rest' + (" parameters. Found: " + parameter.type));
+            break;
+        }
+        this.visitAny(parameter);
+      }
+    },
+    visitForStatement: function(tree) {
+      if (tree.initialiser !== null) {
+        this.checkVisit_(tree.initialiser.isExpression() || tree.initialiser.type === VARIABLE_DECLARATION_LIST, tree.initialiser, 'variable declaration list or expression expected');
+      }
+      if (tree.condition !== null) {
+        this.checkVisit_(tree.condition.isExpression(), tree.condition, 'expression expected');
+      }
+      if (tree.increment !== null) {
+        this.checkVisit_(tree.increment.isExpression(), tree.increment, 'expression expected');
+      }
+      this.checkVisit_(tree.body.isStatement(), tree.body, 'statement expected');
+    },
+    visitFunctionBody: function(tree) {
+      for (var i = 0; i < tree.statements.length; i++) {
+        var statement = tree.statements[i];
+        this.checkVisit_(statement.isStatementListItem(), statement, 'statement expected');
+      }
+    },
+    visitFunctionDeclaration: function(tree) {
+      this.checkType_(BINDING_IDENTIFIER, tree.name, 'binding identifier expected');
+      this.visitFunction_(tree);
+    },
+    visitFunctionExpression: function(tree) {
+      if (tree.name !== null) {
+        this.checkType_(BINDING_IDENTIFIER, tree.name, 'binding identifier expected');
+      }
+      this.visitFunction_(tree);
+    },
+    visitFunction_: function(tree) {
+      this.checkType_(FORMAL_PARAMETER_LIST, tree.formalParameterList, 'formal parameters expected');
+      this.checkType_(FUNCTION_BODY, tree.functionBody, 'function body expected');
+    },
+    visitGetAccessor: function(tree) {
+      this.checkPropertyName_(tree.name);
+      this.checkType_(FUNCTION_BODY, tree.body, 'function body expected');
+    },
+    visitIfStatement: function(tree) {
+      this.checkVisit_(tree.condition.isExpression(), tree.condition, 'expression expected');
+      this.checkVisit_(tree.ifClause.isStatement(), tree.ifClause, 'statement expected');
+      if (tree.elseClause !== null) {
+        this.checkVisit_(tree.elseClause.isStatement(), tree.elseClause, 'statement expected');
+      }
+    },
+    visitLabelledStatement: function(tree) {
+      this.checkVisit_(tree.statement.isStatement(), tree.statement, 'statement expected');
+    },
+    visitMemberExpression: function(tree) {
+      this.check_(tree.operand.isMemberExpression(), tree.operand, 'member expression expected');
+      if (tree.operand instanceof NewExpression) {
+        this.check_(tree.operand.args !== null, tree.operand, 'new args expected');
+      }
+      this.visitAny(tree.operand);
+    },
+    visitMemberLookupExpression: function(tree) {
+      this.check_(tree.operand.isMemberExpression(), tree.operand, 'member expression expected');
+      if (tree.operand instanceof NewExpression) {
+        this.check_(tree.operand.args !== null, tree.operand, 'new args expected');
+      }
+      this.visitAny(tree.operand);
+    },
+    visitSyntaxErrorTree: function(tree) {
+      this.fail_(tree, ("parse tree contains SyntaxError: " + tree.message));
+    },
+    visitModuleSpecifier: function(tree) {
+      this.check_(tree.token.type == STRING || tree.moduleName, 'string or identifier expected');
+    },
+    visitModuleDeclaration: function(tree) {
+      this.checkType_(MODULE_SPECIFIER, tree.expression, 'module expression expected');
+    },
+    visitNewExpression: function(tree) {
+      this.checkVisit_(tree.operand.isMemberExpression(), tree.operand, 'member expression expected');
+      this.visitAny(tree.args);
+    },
+    visitObjectLiteralExpression: function(tree) {
+      for (var i = 0; i < tree.propertyNameAndValues.length; i++) {
+        var propertyNameAndValue = tree.propertyNameAndValues[i];
+        switch (propertyNameAndValue.type) {
+          case GET_ACCESSOR:
+          case SET_ACCESSOR:
+          case PROPERTY_METHOD_ASSIGNMENT:
+            this.check_(!propertyNameAndValue.isStatic, propertyNameAndValue, 'static is not allowed in object literal expression');
+          case PROPERTY_NAME_ASSIGNMENT:
+          case PROPERTY_NAME_SHORTHAND:
+            break;
+          default:
+            this.fail_(propertyNameAndValue, 'accessor, property name ' + 'assignment or property method assigment expected');
+        }
+        this.visitAny(propertyNameAndValue);
+      }
+    },
+    visitObjectPattern: function(tree) {
+      for (var i = 0; i < tree.fields.length; i++) {
+        var field = tree.fields[i];
+        this.checkVisit_(field.type === OBJECT_PATTERN_FIELD || field.type === BINDING_ELEMENT || field.type === IDENTIFIER_EXPRESSION, field, 'object pattern field expected');
+      }
+    },
+    visitObjectPatternField: function(tree) {
+      this.checkPropertyName_(tree.name);
+      this.checkVisit_(tree.element.type === BINDING_ELEMENT || tree.element.isPattern() || tree.element.isLeftHandSideExpression(), tree.element, 'binding element expected');
+    },
+    visitParenExpression: function(tree) {
+      if (tree.expression.isPattern()) {
+        this.visitAny(tree.expression);
+      } else {
+        this.checkVisit_(tree.expression.isExpression(), tree.expression, 'expression expected');
+      }
+    },
+    visitPostfixExpression: function(tree) {
+      this.checkVisit_(tree.operand.isArrowFunctionExpression(), tree.operand, 'assignment expression expected');
+    },
+    visitPredefinedType: function(tree) {},
+    visitScript: function(tree) {
+      for (var i = 0; i < tree.scriptItemList.length; i++) {
+        var scriptItemList = tree.scriptItemList[i];
+        this.checkVisit_(scriptItemList.isScriptElement(), scriptItemList, 'global script item expected');
+      }
+    },
+    checkPropertyName_: function(tree) {
+      this.checkVisit_(tree.type === LITERAL_PROPERTY_NAME || tree.type === COMPUTED_PROPERTY_NAME, tree, 'property name expected');
+    },
+    visitPropertyNameAssignment: function(tree) {
+      this.checkPropertyName_(tree.name);
+      this.checkVisit_(tree.value.isArrowFunctionExpression(), tree.value, 'assignment expression expected');
+    },
+    visitPropertyNameShorthand: function(tree) {
+      this.check_(tree.name.type === IDENTIFIER, tree, 'identifier token expected');
+    },
+    visitLiteralPropertyName: function(tree) {
+      var type = tree.literalToken.type;
+      this.check_(tree.literalToken.isKeyword() || type === IDENTIFIER || type === NUMBER || type === STRING, tree, 'Unexpected token in literal property name');
+    },
+    visitTemplateLiteralExpression: function(tree) {
+      if (tree.operand) {
+        this.checkVisit_(tree.operand.isMemberExpression(), tree.operand, 'member or call expression expected');
+      }
+      for (var i = 0; i < tree.elements.length; i++) {
+        var element = tree.elements[i];
+        if (i % 2) {
+          this.checkType_(TEMPLATE_SUBSTITUTION, element, 'Template literal substitution expected');
+        } else {
+          this.checkType_(TEMPLATE_LITERAL_PORTION, element, 'Template literal portion expected');
+        }
+      }
+    },
+    visitReturnStatement: function(tree) {
+      if (tree.expression !== null) {
+        this.checkVisit_(tree.expression.isExpression(), tree.expression, 'expression expected');
+      }
+    },
+    visitSetAccessor: function(tree) {
+      this.checkPropertyName_(tree.name);
+      this.checkType_(FUNCTION_BODY, tree.body, 'function body expected');
+    },
+    visitSpreadExpression: function(tree) {
+      this.checkVisit_(tree.expression.isArrowFunctionExpression(), tree.expression, 'assignment expression expected');
+    },
+    visitStateMachine: function(tree) {
+      this.fail_(tree, 'State machines are never valid outside of the ' + 'GeneratorTransformer pass.');
+    },
+    visitSwitchStatement: function(tree) {
+      this.checkVisit_(tree.expression.isExpression(), tree.expression, 'expression expected');
+      var defaultCount = 0;
+      for (var i = 0; i < tree.caseClauses.length; i++) {
+        var caseClause = tree.caseClauses[i];
+        if (caseClause.type === DEFAULT_CLAUSE) {
+          ++defaultCount;
+          this.checkVisit_(defaultCount <= 1, caseClause, 'no more than one default clause allowed');
+        } else {
+          this.checkType_(CASE_CLAUSE, caseClause, 'case or default clause expected');
+        }
+      }
+    },
+    visitThrowStatement: function(tree) {
+      if (tree.value === null) {
+        return;
+      }
+      this.checkVisit_(tree.value.isExpression(), tree.value, 'expression expected');
+    },
+    visitTryStatement: function(tree) {
+      this.checkType_(BLOCK, tree.body, 'block expected');
+      if (tree.catchBlock !== null) {
+        this.checkType_(CATCH, tree.catchBlock, 'catch block expected');
+      }
+      if (tree.finallyBlock !== null) {
+        this.checkType_(FINALLY, tree.finallyBlock, 'finally block expected');
+      }
+      if (tree.catchBlock === null && tree.finallyBlock === null) {
+        this.fail_(tree, 'either catch or finally must be present');
+      }
+    },
+    visitTypeName: function(tree) {},
+    visitUnaryExpression: function(tree) {
+      this.checkVisit_(tree.operand.isArrowFunctionExpression(), tree.operand, 'assignment expression expected');
+    },
+    visitVariableDeclaration: function(tree) {
+      this.checkVisit_(tree.lvalue.isPattern() || tree.lvalue.type == BINDING_IDENTIFIER, tree.lvalue, 'binding identifier expected, found: ' + tree.lvalue.type);
+      if (tree.initialiser !== null) {
+        this.checkVisit_(tree.initialiser.isArrowFunctionExpression(), tree.initialiser, 'assignment expression expected');
+      }
+    },
+    visitWhileStatement: function(tree) {
+      this.checkVisit_(tree.condition.isExpression(), tree.condition, 'expression expected');
+      this.checkVisit_(tree.body.isStatement(), tree.body, 'statement expected');
+    },
+    visitWithStatement: function(tree) {
+      this.checkVisit_(tree.expression.isExpression(), tree.expression, 'expression expected');
+      this.checkVisit_(tree.body.isStatement(), tree.body, 'statement expected');
+    },
+    visitYieldExpression: function(tree) {
+      if (tree.expression !== null) {
+        this.checkVisit_(tree.expression.isExpression(), tree.expression, 'expression expected');
+      }
+    }
+  }, {}, ParseTreeVisitor);
+  ParseTreeValidator.validate = function(tree) {
+    var validator = new ParseTreeValidator();
+    try {
+      validator.visitAny(tree);
+    } catch (e) {
+      if (!(e instanceof ValidationError)) {
+        throw e;
+      }
+      var location = null;
+      if (e.tree !== null) {
+        location = e.tree.location;
+      }
+      if (location === null) {
+        location = tree.location;
+      }
+      var locationString = location !== null ? location.start.toString() : '(unknown)';
+      throw new Error(("Parse tree validation failure '" + e.message + "' at " + locationString + ":") + '\n\n' + TreeWriter.write(tree, {
+        highlighted: e.tree,
+        showLineNumbers: true
+      }) + '\n');
+    }
+  };
+  return {get ParseTreeValidator() {
+      return ParseTreeValidator;
+    }};
+});
+System.register("traceur@0.0.32/src/util/ObjectMap", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/util/ObjectMap";
+  var ObjectMap = function ObjectMap() {
+    this.keys_ = Object.create(null);
+    this.values_ = Object.create(null);
+  };
+  ($traceurRuntime.createClass)(ObjectMap, {
+    set: function(key, value) {
+      var uid = key.uid;
+      this.keys_[uid] = key;
+      this.values_[uid] = value;
+    },
+    get: function(key) {
+      return this.values_[key.uid];
+    },
+    has: function(key) {
+      return key.uid in this.keys_;
+    },
+    addAll: function(other) {
+      for (var uid in other.keys_) {
+        this.keys_[uid] = other.keys_[uid];
+        this.values_[uid] = other.values_[uid];
+      }
+    },
+    keys: function() {
+      var $__43 = this;
+      return Object.keys(this.keys_).map((function(uid) {
+        return $__43.keys_[uid];
+      }));
+    },
+    values: function() {
+      var $__43 = this;
+      return Object.keys(this.values_).map((function(uid) {
+        return $__43.values_[uid];
+      }));
+    },
+    remove: function(key) {
+      var uid = key.uid;
+      delete this.keys_[uid];
+      delete this.values_[uid];
+    }
+  }, {});
+  return {get ObjectMap() {
+      return ObjectMap;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/ParseTreeFactory", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/ParseTreeFactory";
+  var IdentifierToken = System.get("traceur@0.0.32/src/syntax/IdentifierToken").IdentifierToken;
+  var LiteralToken = System.get("traceur@0.0.32/src/syntax/LiteralToken").LiteralToken;
+  var $__47 = System.get("traceur@0.0.32/src/syntax/trees/ParseTree"),
+      ParseTree = $__47.ParseTree,
+      ParseTreeType = $__47.ParseTreeType;
+  var $__47 = System.get("traceur@0.0.32/src/syntax/PredefinedName"),
+      BIND = $__47.BIND,
+      CALL = $__47.CALL,
+      CREATE = $__47.CREATE,
+      DEFINE_PROPERTY = $__47.DEFINE_PROPERTY,
+      FREEZE = $__47.FREEZE,
+      OBJECT = $__47.OBJECT,
+      PREVENT_EXTENSIONS = $__47.PREVENT_EXTENSIONS,
+      UNDEFINED = $__47.UNDEFINED,
+      getParameterName = $__47.getParameterName;
+  var Token = System.get("traceur@0.0.32/src/syntax/Token").Token;
+  var $__47 = System.get("traceur@0.0.32/src/syntax/TokenType"),
+      EQUAL = $__47.EQUAL,
+      FALSE = $__47.FALSE,
+      NULL = $__47.NULL,
+      NUMBER = $__47.NUMBER,
+      STRING = $__47.STRING,
+      TRUE = $__47.TRUE,
+      VOID = $__47.VOID;
+  var assert = System.get("traceur@0.0.32/src/util/assert").assert;
+  var $__47 = System.get("traceur@0.0.32/src/syntax/trees/ParseTrees"),
+      ArgumentList = $__47.ArgumentList,
+      ArrayComprehension = $__47.ArrayComprehension,
+      ArrayLiteralExpression = $__47.ArrayLiteralExpression,
+      ArrayPattern = $__47.ArrayPattern,
+      ArrowFunctionExpression = $__47.ArrowFunctionExpression,
+      AwaitStatement = $__47.AwaitStatement,
+      BinaryOperator = $__47.BinaryOperator,
+      BindingElement = $__47.BindingElement,
+      BindingIdentifier = $__47.BindingIdentifier,
+      Block = $__47.Block,
+      BreakStatement = $__47.BreakStatement,
+      CallExpression = $__47.CallExpression,
+      CaseClause = $__47.CaseClause,
+      Catch = $__47.Catch,
+      ClassDeclaration = $__47.ClassDeclaration,
+      ClassExpression = $__47.ClassExpression,
+      CommaExpression = $__47.CommaExpression,
+      ComprehensionFor = $__47.ComprehensionFor,
+      ComprehensionIf = $__47.ComprehensionIf,
+      ComputedPropertyName = $__47.ComputedPropertyName,
+      ConditionalExpression = $__47.ConditionalExpression,
+      ContinueStatement = $__47.ContinueStatement,
+      CoverFormals = $__47.CoverFormals,
+      CoverInitialisedName = $__47.CoverInitialisedName,
+      DebuggerStatement = $__47.DebuggerStatement,
+      DefaultClause = $__47.DefaultClause,
+      DoWhileStatement = $__47.DoWhileStatement,
+      EmptyStatement = $__47.EmptyStatement,
+      ExportDeclaration = $__47.ExportDeclaration,
+      ExportSpecifier = $__47.ExportSpecifier,
+      ExportSpecifierSet = $__47.ExportSpecifierSet,
+      ExportStar = $__47.ExportStar,
+      ExpressionStatement = $__47.ExpressionStatement,
+      Finally = $__47.Finally,
+      ForInStatement = $__47.ForInStatement,
+      ForOfStatement = $__47.ForOfStatement,
+      ForStatement = $__47.ForStatement,
+      FormalParameter = $__47.FormalParameter,
+      FormalParameterList = $__47.FormalParameterList,
+      FunctionBody = $__47.FunctionBody,
+      FunctionDeclaration = $__47.FunctionDeclaration,
+      FunctionExpression = $__47.FunctionExpression,
+      GeneratorComprehension = $__47.GeneratorComprehension,
+      GetAccessor = $__47.GetAccessor,
+      IdentifierExpression = $__47.IdentifierExpression,
+      IfStatement = $__47.IfStatement,
+      ImportDeclaration = $__47.ImportDeclaration,
+      ImportSpecifier = $__47.ImportSpecifier,
+      ImportSpecifierSet = $__47.ImportSpecifierSet,
+      LabelledStatement = $__47.LabelledStatement,
+      LiteralExpression = $__47.LiteralExpression,
+      LiteralPropertyName = $__47.LiteralPropertyName,
+      MemberExpression = $__47.MemberExpression,
+      MemberLookupExpression = $__47.MemberLookupExpression,
+      Module = $__47.Module,
+      ModuleDeclaration = $__47.ModuleDeclaration,
+      ModuleSpecifier = $__47.ModuleSpecifier,
+      NamedExport = $__47.NamedExport,
+      NewExpression = $__47.NewExpression,
+      ObjectLiteralExpression = $__47.ObjectLiteralExpression,
+      ObjectPattern = $__47.ObjectPattern,
+      ObjectPatternField = $__47.ObjectPatternField,
+      ParenExpression = $__47.ParenExpression,
+      PostfixExpression = $__47.PostfixExpression,
+      PredefinedType = $__47.PredefinedType,
+      Script = $__47.Script,
+      PropertyMethodAssignment = $__47.PropertyMethodAssignment,
+      PropertyNameAssignment = $__47.PropertyNameAssignment,
+      PropertyNameShorthand = $__47.PropertyNameShorthand,
+      RestParameter = $__47.RestParameter,
+      ReturnStatement = $__47.ReturnStatement,
+      SetAccessor = $__47.SetAccessor,
+      SpreadExpression = $__47.SpreadExpression,
+      SpreadPatternElement = $__47.SpreadPatternElement,
+      SuperExpression = $__47.SuperExpression,
+      SwitchStatement = $__47.SwitchStatement,
+      SyntaxErrorTree = $__47.SyntaxErrorTree,
+      TemplateLiteralExpression = $__47.TemplateLiteralExpression,
+      TemplateLiteralPortion = $__47.TemplateLiteralPortion,
+      TemplateSubstitution = $__47.TemplateSubstitution,
+      ThisExpression = $__47.ThisExpression,
+      ThrowStatement = $__47.ThrowStatement,
+      TryStatement = $__47.TryStatement,
+      TypeName = $__47.TypeName,
+      UnaryExpression = $__47.UnaryExpression,
+      VariableDeclaration = $__47.VariableDeclaration,
+      VariableDeclarationList = $__47.VariableDeclarationList,
+      VariableStatement = $__47.VariableStatement,
+      WhileStatement = $__47.WhileStatement,
+      WithStatement = $__47.WithStatement,
+      YieldExpression = $__47.YieldExpression;
+  var slice = Array.prototype.slice.call.bind(Array.prototype.slice);
+  var map = Array.prototype.map.call.bind(Array.prototype.map);
+  function createOperatorToken(operator) {
+    return new Token(operator, null);
+  }
+  function createIdentifierToken(identifier) {
+    return new IdentifierToken(null, identifier);
+  }
+  function createPropertyNameToken(name) {
+    return createIdentifierToken(name);
+  }
+  function createStringLiteralToken(value) {
+    return new LiteralToken(STRING, JSON.stringify(value), null);
+  }
+  function createBooleanLiteralToken(value) {
+    return new Token(value ? TRUE : FALSE, null);
+  }
+  function createNullLiteralToken() {
+    return new LiteralToken(NULL, 'null', null);
+  }
+  function createNumberLiteralToken(value) {
+    return new LiteralToken(NUMBER, String(value), null);
+  }
+  function createEmptyParameters() {
+    return [];
+  }
+  function createStatementList(statementsOrHead) {
+    for (var args = [],
+        $__45 = 1; $__45 < arguments.length; $__45++)
+      args[$__45 - 1] = arguments[$__45];
+    if (statementsOrHead instanceof Array)
+      return $traceurRuntime.spread(statementsOrHead, args);
+    return slice(arguments);
+  }
+  function createBindingElement(arg) {
+    var binding = createBindingIdentifier(arg);
+    return new BindingElement(null, binding, null);
+  }
+  function createFormalParameter(arg) {
+    return new FormalParameter(null, createBindingElement(arg), null, []);
+  }
+  function createParameterList(arg0, var_args) {
+    if (typeof arg0 == 'string') {
+      var parameterList = map(arguments, createFormalParameter);
+      return new FormalParameterList(null, parameterList);
+    }
+    if (typeof arg0 == 'number')
+      return createParameterListHelper(arg0, false);
+    if (arg0 instanceof IdentifierToken) {
+      return new FormalParameterList(null, [createFormalParameter(arg0)]);
+    }
+    var builder = arg0.map(createFormalParameter);
+    return new FormalParameterList(null, builder);
+  }
+  function createParameterListHelper(numberOfParameters, hasRestParams) {
+    var builder = [];
+    for (var index = 0; index < numberOfParameters; index++) {
+      var parameterName = getParameterName(index);
+      var isRestParameter = index == numberOfParameters - 1 && hasRestParams;
+      builder.push(isRestParameter ? new FormalParameter(null, createRestParameter(parameterName), null, []) : createFormalParameter(parameterName));
+    }
+    return new FormalParameterList(null, builder);
+  }
+  function createParameterListWithRestParams(numberOfParameters) {
+    return createParameterListHelper(numberOfParameters, true);
+  }
+  function createParameterReference(index) {
+    return createIdentifierExpression(getParameterName(index));
+  }
+  function createEmptyParameterList() {
+    return new FormalParameterList(null, []);
+  }
+  function createEmptyList() {
+    return [];
+  }
+  function createArgumentList(numberListOrFirst, var_args) {
+    if (typeof numberListOrFirst == 'number') {
+      return createArgumentListFromParameterList(createParameterList(numberListOrFirst));
+    }
+    var list;
+    if (numberListOrFirst instanceof Array)
+      list = numberListOrFirst;
+    else
+      list = slice(arguments);
+    return new ArgumentList(null, list);
+  }
+  function createArgumentListFromParameterList(formalParameterList) {
+    var builder = formalParameterList.parameters.map(function(parameter) {
+      if (parameter.isRestParameter()) {
+        return createSpreadExpression(createIdentifierExpression(parameter.identifier));
+      } else {
+        return parameter;
+      }
+    });
+    return new ArgumentList(null, builder);
+  }
+  function createEmptyArgumentList() {
+    return new ArgumentList(null, createEmptyList());
+  }
+  function createArrayLiteralExpression(list) {
+    return new ArrayLiteralExpression(null, list);
+  }
+  function createEmptyArrayLiteralExpression() {
+    return createArrayLiteralExpression(createEmptyList());
+  }
+  function createArrayPattern(list) {
+    return new ArrayPattern(null, list);
+  }
+  function createAssignmentExpression(lhs, rhs) {
+    return new BinaryOperator(null, lhs, createOperatorToken(EQUAL), rhs);
+  }
+  function createBinaryOperator(left, operator, right) {
+    return new BinaryOperator(null, left, operator, right);
+  }
+  function createBindingIdentifier(identifier) {
+    if (typeof identifier === 'string')
+      identifier = createIdentifierToken(identifier);
+    else if (identifier.type === ParseTreeType.BINDING_IDENTIFIER)
+      return identifier;
+    else if (identifier.type === ParseTreeType.IDENTIFIER_EXPRESSION)
+      return new BindingIdentifier(identifier.location, identifier.identifierToken);
+    return new BindingIdentifier(null, identifier);
+  }
+  function createEmptyStatement() {
+    return new EmptyStatement(null);
+  }
+  function createEmptyBlock() {
+    return createBlock(createEmptyList());
+  }
+  function createBlock(statements) {
+    if (statements instanceof ParseTree)
+      statements = slice(arguments);
+    return new Block(null, statements);
+  }
+  function createFunctionBody(statements) {
+    return new FunctionBody(null, statements);
+  }
+  function createScopedExpression(body) {
+    var scope = arguments[1] !== (void 0) ? arguments[1] : createThisExpression();
+    assert(body.type === 'FUNCTION_BODY');
+    return createCallCall(createParenExpression(createFunctionExpression(createEmptyParameterList(), body)), scope);
+  }
+  function createImmediatelyInvokedFunctionExpression(body) {
+    assert(body.type === 'FUNCTION_BODY');
+    return createCallExpression(createParenExpression(createFunctionExpression(createEmptyParameterList(), body)));
+  }
+  function createCallExpression(operand) {
+    var args = arguments[1] !== (void 0) ? arguments[1] : createEmptyArgumentList();
+    return new CallExpression(null, operand, args);
+  }
+  function createBoundCall(func, thisTree) {
+    return createCallExpression(createMemberExpression(func.type == ParseTreeType.FUNCTION_EXPRESSION ? createParenExpression(func) : func, BIND), createArgumentList(thisTree));
+  }
+  function createBreakStatement() {
+    var name = arguments[0] !== (void 0) ? arguments[0] : null;
+    return new BreakStatement(null, name);
+  }
+  function createCallCall(func, thisExpression, args, var_args) {
+    var $__48;
+    if (args instanceof ParseTree)
+      args = slice(arguments, 2);
+    var builder = [thisExpression];
+    if (args)
+      ($__48 = builder).push.apply($__48, $traceurRuntime.toObject(args));
+    return createCallExpression(createMemberExpression(func, CALL), createArgumentList(builder));
+  }
+  function createCallCallStatement(func, thisExpression) {
+    for (var args = [],
+        $__46 = 2; $__46 < arguments.length; $__46++)
+      args[$__46 - 2] = arguments[$__46];
+    return createExpressionStatement(createCallCall(func, thisExpression, args));
+  }
+  function createCaseClause(expression, statements) {
+    return new CaseClause(null, expression, statements);
+  }
+  function createCatch(identifier, catchBody) {
+    identifier = createBindingIdentifier(identifier);
+    return new Catch(null, identifier, catchBody);
+  }
+  function createClassDeclaration(name, superClass, elements) {
+    return new ClassDeclaration(null, name, superClass, elements, []);
+  }
+  function createCommaExpression(expressions) {
+    return new CommaExpression(null, expressions);
+  }
+  function createConditionalExpression(condition, left, right) {
+    return new ConditionalExpression(null, condition, left, right);
+  }
+  function createContinueStatement() {
+    var name = arguments[0] !== (void 0) ? arguments[0] : null;
+    return new ContinueStatement(null, name);
+  }
+  function createDefaultClause(statements) {
+    return new DefaultClause(null, statements);
+  }
+  function createDoWhileStatement(body, condition) {
+    return new DoWhileStatement(null, body, condition);
+  }
+  function createAssignmentStatement(lhs, rhs) {
+    return createExpressionStatement(createAssignmentExpression(lhs, rhs));
+  }
+  function createCallStatement(operand) {
+    var args = arguments[1];
+    return createExpressionStatement(createCallExpression(operand, args));
+  }
+  function createExpressionStatement(expression) {
+    return new ExpressionStatement(null, expression);
+  }
+  function createFinally(block) {
+    return new Finally(null, block);
+  }
+  function createForOfStatement(initialiser, collection, body) {
+    return new ForOfStatement(null, initialiser, collection, body);
+  }
+  function createForInStatement(initialiser, collection, body) {
+    return new ForInStatement(null, initialiser, collection, body);
+  }
+  function createForStatement(variables, condition, increment, body) {
+    return new ForStatement(null, variables, condition, increment, body);
+  }
+  function createFunctionExpression(formalParameterList, body) {
+    assert(body.type === 'FUNCTION_BODY');
+    return new FunctionExpression(null, null, false, formalParameterList, null, [], body);
+  }
+  function createGetAccessor(name, body) {
+    if (typeof name == 'string')
+      name = createPropertyNameToken(name);
+    var isStatic = false;
+    return new GetAccessor(null, isStatic, name, null, [], body);
+  }
+  function createIdentifierExpression(identifier) {
+    if (typeof identifier == 'string')
+      identifier = createIdentifierToken(identifier);
+    else if (identifier instanceof BindingIdentifier)
+      identifier = identifier.identifierToken;
+    return new IdentifierExpression(null, identifier);
+  }
+  function createUndefinedExpression() {
+    return createIdentifierExpression(UNDEFINED);
+  }
+  function createIfStatement(condition, ifClause) {
+    var elseClause = arguments[2] !== (void 0) ? arguments[2] : null;
+    return new IfStatement(null, condition, ifClause, elseClause);
+  }
+  function createLabelledStatement(name, statement) {
+    return new LabelledStatement(null, name, statement);
+  }
+  function createStringLiteral(value) {
+    return new LiteralExpression(null, createStringLiteralToken(value));
+  }
+  function createBooleanLiteral(value) {
+    return new LiteralExpression(null, createBooleanLiteralToken(value));
+  }
+  function createTrueLiteral() {
+    return createBooleanLiteral(true);
+  }
+  function createFalseLiteral() {
+    return createBooleanLiteral(false);
+  }
+  function createNullLiteral() {
+    return new LiteralExpression(null, createNullLiteralToken());
+  }
+  function createNumberLiteral(value) {
+    return new LiteralExpression(null, createNumberLiteralToken(value));
+  }
+  function createMemberExpression(operand, memberName, memberNames) {
+    if (typeof operand == 'string' || operand instanceof IdentifierToken)
+      operand = createIdentifierExpression(operand);
+    if (typeof memberName == 'string')
+      memberName = createIdentifierToken(memberName);
+    if (memberName instanceof LiteralToken)
+      memberName = new LiteralExpression(null, memberName);
+    var tree = memberName instanceof LiteralExpression ? new MemberLookupExpression(null, operand, memberName) : new MemberExpression(null, operand, memberName);
+    for (var i = 2; i < arguments.length; i++) {
+      tree = createMemberExpression(tree, arguments[i]);
+    }
+    return tree;
+  }
+  function createMemberLookupExpression(operand, memberExpression) {
+    return new MemberLookupExpression(null, operand, memberExpression);
+  }
+  function createThisExpression() {
+    var memberName = arguments[0];
+    var result = new ThisExpression(null);
+    if (memberName) {
+      result = createMemberExpression(result, memberName);
+    }
+    return result;
+  }
+  function createNewExpression(operand, args) {
+    return new NewExpression(null, operand, args);
+  }
+  function createObjectFreeze(value) {
+    return createCallExpression(createMemberExpression(OBJECT, FREEZE), createArgumentList(value));
+  }
+  function createObjectPreventExtensions(value) {
+    return createCallExpression(createMemberExpression(OBJECT, PREVENT_EXTENSIONS), createArgumentList(value));
+  }
+  function createObjectCreate(protoExpression, descriptors) {
+    var argumentList = [protoExpression];
+    if (descriptors)
+      argumentList.push(descriptors);
+    return createCallExpression(createMemberExpression(OBJECT, CREATE), createArgumentList(argumentList));
+  }
+  function createPropertyDescriptor(descr) {
+    var propertyNameAndValues = Object.keys(descr).map(function(name) {
+      var value = descr[name];
+      if (!(value instanceof ParseTree))
+        value = createBooleanLiteral(!!value);
+      return createPropertyNameAssignment(name, value);
+    });
+    return createObjectLiteralExpression(propertyNameAndValues);
+  }
+  function createDefineProperty(tree, name, descr) {
+    if (typeof name === 'string')
+      name = createStringLiteral(name);
+    return createCallExpression(createMemberExpression(OBJECT, DEFINE_PROPERTY), createArgumentList(tree, name, createPropertyDescriptor(descr)));
+  }
+  function createObjectLiteralExpression(propertyNameAndValues) {
+    if (propertyNameAndValues instanceof ParseTree)
+      propertyNameAndValues = slice(arguments);
+    return new ObjectLiteralExpression(null, propertyNameAndValues);
+  }
+  function createObjectPattern(list) {
+    return new ObjectPattern(null, list);
+  }
+  function createObjectPatternField(identifier, element) {
+    identifier = createBindingIdentifier(identifier);
+    return new ObjectPatternField(null, identifier, element);
+  }
+  function createParenExpression(expression) {
+    return new ParenExpression(null, expression);
+  }
+  function createPostfixExpression(operand, operator) {
+    return new PostfixExpression(null, operand, operator);
+  }
+  function createScript(scriptItemList) {
+    return new Script(null, scriptItemList);
+  }
+  function createPropertyNameAssignment(identifier, value) {
+    if (typeof identifier == 'string')
+      identifier = createLiteralPropertyName(identifier);
+    return new PropertyNameAssignment(null, identifier, value);
+  }
+  function createLiteralPropertyName(name) {
+    return new LiteralPropertyName(null, createIdentifierToken(name));
+  }
+  function createRestParameter(identifier) {
+    return new RestParameter(null, createBindingIdentifier(identifier));
+  }
+  function createReturnStatement(expression) {
+    return new ReturnStatement(null, expression);
+  }
+  function createYieldStatement(expression, isYieldFor) {
+    return createExpressionStatement(new YieldExpression(null, expression, isYieldFor));
+  }
+  function createSetAccessor(name, parameter, body) {
+    if (typeof name == 'string')
+      name = createPropertyNameToken(name);
+    if (typeof parameter == 'string')
+      parameter = createIdentifierToken(parameter);
+    var isStatic = false;
+    return new SetAccessor(null, isStatic, name, parameter, [], body);
+  }
+  function createSpreadExpression(expression) {
+    return new SpreadExpression(null, expression);
+  }
+  function createSpreadPatternElement(lvalue) {
+    return new SpreadPatternElement(null, lvalue);
+  }
+  function createSwitchStatement(expression, caseClauses) {
+    return new SwitchStatement(null, expression, caseClauses);
+  }
+  function createThrowStatement(value) {
+    return new ThrowStatement(null, value);
+  }
+  function createTryStatement(body, catchBlock) {
+    var finallyBlock = arguments[2] !== (void 0) ? arguments[2] : null;
+    return new TryStatement(null, body, catchBlock, finallyBlock);
+  }
+  function createUnaryExpression(operator, operand) {
+    return new UnaryExpression(null, operator, operand);
+  }
+  function createUseStrictDirective() {
+    return createExpressionStatement(createStringLiteral('use strict'));
+  }
+  function createVariableDeclarationList(binding, identifierOrDeclarations, initialiser) {
+    if (identifierOrDeclarations instanceof Array) {
+      var declarations = identifierOrDeclarations;
+      return new VariableDeclarationList(null, binding, declarations);
+    }
+    var identifier = identifierOrDeclarations;
+    return createVariableDeclarationList(binding, [createVariableDeclaration(identifier, initialiser)]);
+  }
+  function createVariableDeclaration(identifier, initialiser) {
+    if (!(identifier instanceof ParseTree) || identifier.type !== ParseTreeType.BINDING_IDENTIFIER && identifier.type !== ParseTreeType.OBJECT_PATTERN && identifier.type !== ParseTreeType.ARRAY_PATTERN) {
+      identifier = createBindingIdentifier(identifier);
+    }
+    return new VariableDeclaration(null, identifier, null, initialiser);
+  }
+  function createVariableStatement(listOrBinding, identifier, initialiser) {
+    if (listOrBinding instanceof VariableDeclarationList)
+      return new VariableStatement(null, listOrBinding);
+    var binding = listOrBinding;
+    var list = createVariableDeclarationList(binding, identifier, initialiser);
+    return createVariableStatement(list);
+  }
+  function createVoid0() {
+    return createParenExpression(createUnaryExpression(createOperatorToken(VOID), createNumberLiteral(0)));
+  }
+  function createWhileStatement(condition, body) {
+    return new WhileStatement(null, condition, body);
+  }
+  function createWithStatement(expression, body) {
+    return new WithStatement(null, expression, body);
+  }
+  function createAssignStateStatement(state) {
+    return createAssignmentStatement(createMemberExpression('$ctx', 'state'), createNumberLiteral(state));
+  }
+  return {
+    get createOperatorToken() {
+      return createOperatorToken;
+    },
+    get createIdentifierToken() {
+      return createIdentifierToken;
+    },
+    get createPropertyNameToken() {
+      return createPropertyNameToken;
+    },
+    get createStringLiteralToken() {
+      return createStringLiteralToken;
+    },
+    get createBooleanLiteralToken() {
+      return createBooleanLiteralToken;
+    },
+    get createNullLiteralToken() {
+      return createNullLiteralToken;
+    },
+    get createNumberLiteralToken() {
+      return createNumberLiteralToken;
+    },
+    get createEmptyParameters() {
+      return createEmptyParameters;
+    },
+    get createStatementList() {
+      return createStatementList;
+    },
+    get createBindingElement() {
+      return createBindingElement;
+    },
+    get createFormalParameter() {
+      return createFormalParameter;
+    },
+    get createParameterList() {
+      return createParameterList;
+    },
+    get createParameterListWithRestParams() {
+      return createParameterListWithRestParams;
+    },
+    get createParameterReference() {
+      return createParameterReference;
+    },
+    get createEmptyParameterList() {
+      return createEmptyParameterList;
+    },
+    get createEmptyList() {
+      return createEmptyList;
+    },
+    get createArgumentList() {
+      return createArgumentList;
+    },
+    get createArgumentListFromParameterList() {
+      return createArgumentListFromParameterList;
+    },
+    get createEmptyArgumentList() {
+      return createEmptyArgumentList;
+    },
+    get createArrayLiteralExpression() {
+      return createArrayLiteralExpression;
+    },
+    get createEmptyArrayLiteralExpression() {
+      return createEmptyArrayLiteralExpression;
+    },
+    get createArrayPattern() {
+      return createArrayPattern;
+    },
+    get createAssignmentExpression() {
+      return createAssignmentExpression;
+    },
+    get createBinaryOperator() {
+      return createBinaryOperator;
+    },
+    get createBindingIdentifier() {
+      return createBindingIdentifier;
+    },
+    get createEmptyStatement() {
+      return createEmptyStatement;
+    },
+    get createEmptyBlock() {
+      return createEmptyBlock;
+    },
+    get createBlock() {
+      return createBlock;
+    },
+    get createFunctionBody() {
+      return createFunctionBody;
+    },
+    get createScopedExpression() {
+      return createScopedExpression;
+    },
+    get createImmediatelyInvokedFunctionExpression() {
+      return createImmediatelyInvokedFunctionExpression;
+    },
+    get createCallExpression() {
+      return createCallExpression;
+    },
+    get createBoundCall() {
+      return createBoundCall;
+    },
+    get createBreakStatement() {
+      return createBreakStatement;
+    },
+    get createCallCall() {
+      return createCallCall;
+    },
+    get createCallCallStatement() {
+      return createCallCallStatement;
+    },
+    get createCaseClause() {
+      return createCaseClause;
+    },
+    get createCatch() {
+      return createCatch;
+    },
+    get createClassDeclaration() {
+      return createClassDeclaration;
+    },
+    get createCommaExpression() {
+      return createCommaExpression;
+    },
+    get createConditionalExpression() {
+      return createConditionalExpression;
+    },
+    get createContinueStatement() {
+      return createContinueStatement;
+    },
+    get createDefaultClause() {
+      return createDefaultClause;
+    },
+    get createDoWhileStatement() {
+      return createDoWhileStatement;
+    },
+    get createAssignmentStatement() {
+      return createAssignmentStatement;
+    },
+    get createCallStatement() {
+      return createCallStatement;
+    },
+    get createExpressionStatement() {
+      return createExpressionStatement;
+    },
+    get createFinally() {
+      return createFinally;
+    },
+    get createForOfStatement() {
+      return createForOfStatement;
+    },
+    get createForInStatement() {
+      return createForInStatement;
+    },
+    get createForStatement() {
+      return createForStatement;
+    },
+    get createFunctionExpression() {
+      return createFunctionExpression;
+    },
+    get createGetAccessor() {
+      return createGetAccessor;
+    },
+    get createIdentifierExpression() {
+      return createIdentifierExpression;
+    },
+    get createUndefinedExpression() {
+      return createUndefinedExpression;
+    },
+    get createIfStatement() {
+      return createIfStatement;
+    },
+    get createLabelledStatement() {
+      return createLabelledStatement;
+    },
+    get createStringLiteral() {
+      return createStringLiteral;
+    },
+    get createBooleanLiteral() {
+      return createBooleanLiteral;
+    },
+    get createTrueLiteral() {
+      return createTrueLiteral;
+    },
+    get createFalseLiteral() {
+      return createFalseLiteral;
+    },
+    get createNullLiteral() {
+      return createNullLiteral;
+    },
+    get createNumberLiteral() {
+      return createNumberLiteral;
+    },
+    get createMemberExpression() {
+      return createMemberExpression;
+    },
+    get createMemberLookupExpression() {
+      return createMemberLookupExpression;
+    },
+    get createThisExpression() {
+      return createThisExpression;
+    },
+    get createNewExpression() {
+      return createNewExpression;
+    },
+    get createObjectFreeze() {
+      return createObjectFreeze;
+    },
+    get createObjectPreventExtensions() {
+      return createObjectPreventExtensions;
+    },
+    get createObjectCreate() {
+      return createObjectCreate;
+    },
+    get createPropertyDescriptor() {
+      return createPropertyDescriptor;
+    },
+    get createDefineProperty() {
+      return createDefineProperty;
+    },
+    get createObjectLiteralExpression() {
+      return createObjectLiteralExpression;
+    },
+    get createObjectPattern() {
+      return createObjectPattern;
+    },
+    get createObjectPatternField() {
+      return createObjectPatternField;
+    },
+    get createParenExpression() {
+      return createParenExpression;
+    },
+    get createPostfixExpression() {
+      return createPostfixExpression;
+    },
+    get createScript() {
+      return createScript;
+    },
+    get createPropertyNameAssignment() {
+      return createPropertyNameAssignment;
+    },
+    get createLiteralPropertyName() {
+      return createLiteralPropertyName;
+    },
+    get createRestParameter() {
+      return createRestParameter;
+    },
+    get createReturnStatement() {
+      return createReturnStatement;
+    },
+    get createYieldStatement() {
+      return createYieldStatement;
+    },
+    get createSetAccessor() {
+      return createSetAccessor;
+    },
+    get createSpreadExpression() {
+      return createSpreadExpression;
+    },
+    get createSpreadPatternElement() {
+      return createSpreadPatternElement;
+    },
+    get createSwitchStatement() {
+      return createSwitchStatement;
+    },
+    get createThrowStatement() {
+      return createThrowStatement;
+    },
+    get createTryStatement() {
+      return createTryStatement;
+    },
+    get createUnaryExpression() {
+      return createUnaryExpression;
+    },
+    get createUseStrictDirective() {
+      return createUseStrictDirective;
+    },
+    get createVariableDeclarationList() {
+      return createVariableDeclarationList;
+    },
+    get createVariableDeclaration() {
+      return createVariableDeclaration;
+    },
+    get createVariableStatement() {
+      return createVariableStatement;
+    },
+    get createVoid0() {
+      return createVoid0;
+    },
+    get createWhileStatement() {
+      return createWhileStatement;
+    },
+    get createWithStatement() {
+      return createWithStatement;
+    },
+    get createAssignStateStatement() {
+      return createAssignStateStatement;
+    }
+  };
+});
+System.register("traceur@0.0.32/src/codegeneration/ParseTreeTransformer", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/ParseTreeTransformer";
+  var $__50 = System.get("traceur@0.0.32/src/syntax/trees/ParseTrees"),
+      Annotation = $__50.Annotation,
+      AnonBlock = $__50.AnonBlock,
+      ArgumentList = $__50.ArgumentList,
+      ArrayComprehension = $__50.ArrayComprehension,
+      ArrayLiteralExpression = $__50.ArrayLiteralExpression,
+      ArrayPattern = $__50.ArrayPattern,
+      ArrowFunctionExpression = $__50.ArrowFunctionExpression,
+      AwaitStatement = $__50.AwaitStatement,
+      BinaryOperator = $__50.BinaryOperator,
+      BindingElement = $__50.BindingElement,
+      BindingIdentifier = $__50.BindingIdentifier,
+      Block = $__50.Block,
+      BreakStatement = $__50.BreakStatement,
+      CallExpression = $__50.CallExpression,
+      CaseClause = $__50.CaseClause,
+      Catch = $__50.Catch,
+      ClassDeclaration = $__50.ClassDeclaration,
+      ClassExpression = $__50.ClassExpression,
+      CommaExpression = $__50.CommaExpression,
+      ComprehensionFor = $__50.ComprehensionFor,
+      ComprehensionIf = $__50.ComprehensionIf,
+      ComputedPropertyName = $__50.ComputedPropertyName,
+      ConditionalExpression = $__50.ConditionalExpression,
+      ContinueStatement = $__50.ContinueStatement,
+      CoverFormals = $__50.CoverFormals,
+      CoverInitialisedName = $__50.CoverInitialisedName,
+      DebuggerStatement = $__50.DebuggerStatement,
+      DefaultClause = $__50.DefaultClause,
+      DoWhileStatement = $__50.DoWhileStatement,
+      EmptyStatement = $__50.EmptyStatement,
+      ExportDeclaration = $__50.ExportDeclaration,
+      ExportDefault = $__50.ExportDefault,
+      ExportSpecifier = $__50.ExportSpecifier,
+      ExportSpecifierSet = $__50.ExportSpecifierSet,
+      ExportStar = $__50.ExportStar,
+      ExpressionStatement = $__50.ExpressionStatement,
+      Finally = $__50.Finally,
+      ForInStatement = $__50.ForInStatement,
+      ForOfStatement = $__50.ForOfStatement,
+      ForStatement = $__50.ForStatement,
+      FormalParameter = $__50.FormalParameter,
+      FormalParameterList = $__50.FormalParameterList,
+      FunctionBody = $__50.FunctionBody,
+      FunctionDeclaration = $__50.FunctionDeclaration,
+      FunctionExpression = $__50.FunctionExpression,
+      GeneratorComprehension = $__50.GeneratorComprehension,
+      GetAccessor = $__50.GetAccessor,
+      IdentifierExpression = $__50.IdentifierExpression,
+      IfStatement = $__50.IfStatement,
+      ImportedBinding = $__50.ImportedBinding,
+      ImportDeclaration = $__50.ImportDeclaration,
+      ImportSpecifier = $__50.ImportSpecifier,
+      ImportSpecifierSet = $__50.ImportSpecifierSet,
+      LabelledStatement = $__50.LabelledStatement,
+      LiteralExpression = $__50.LiteralExpression,
+      LiteralPropertyName = $__50.LiteralPropertyName,
+      MemberExpression = $__50.MemberExpression,
+      MemberLookupExpression = $__50.MemberLookupExpression,
+      Module = $__50.Module,
+      ModuleDeclaration = $__50.ModuleDeclaration,
+      ModuleSpecifier = $__50.ModuleSpecifier,
+      NamedExport = $__50.NamedExport,
+      NewExpression = $__50.NewExpression,
+      ObjectLiteralExpression = $__50.ObjectLiteralExpression,
+      ObjectPattern = $__50.ObjectPattern,
+      ObjectPatternField = $__50.ObjectPatternField,
+      ParenExpression = $__50.ParenExpression,
+      PostfixExpression = $__50.PostfixExpression,
+      PredefinedType = $__50.PredefinedType,
+      Script = $__50.Script,
+      PropertyMethodAssignment = $__50.PropertyMethodAssignment,
+      PropertyNameAssignment = $__50.PropertyNameAssignment,
+      PropertyNameShorthand = $__50.PropertyNameShorthand,
+      RestParameter = $__50.RestParameter,
+      ReturnStatement = $__50.ReturnStatement,
+      SetAccessor = $__50.SetAccessor,
+      SpreadExpression = $__50.SpreadExpression,
+      SpreadPatternElement = $__50.SpreadPatternElement,
+      SuperExpression = $__50.SuperExpression,
+      SwitchStatement = $__50.SwitchStatement,
+      SyntaxErrorTree = $__50.SyntaxErrorTree,
+      TemplateLiteralExpression = $__50.TemplateLiteralExpression,
+      TemplateLiteralPortion = $__50.TemplateLiteralPortion,
+      TemplateSubstitution = $__50.TemplateSubstitution,
+      ThisExpression = $__50.ThisExpression,
+      ThrowStatement = $__50.ThrowStatement,
+      TryStatement = $__50.TryStatement,
+      TypeName = $__50.TypeName,
+      UnaryExpression = $__50.UnaryExpression,
+      VariableDeclaration = $__50.VariableDeclaration,
+      VariableDeclarationList = $__50.VariableDeclarationList,
+      VariableStatement = $__50.VariableStatement,
+      WhileStatement = $__50.WhileStatement,
+      WithStatement = $__50.WithStatement,
+      YieldExpression = $__50.YieldExpression;
+  var ParseTreeTransformer = function ParseTreeTransformer() {};
+  ($traceurRuntime.createClass)(ParseTreeTransformer, {
+    transformAny: function(tree) {
+      return tree && tree.transform(this);
+    },
+    transformList: function(list) {
+      var $__51;
+      var builder = null;
+      for (var index = 0; index < list.length; index++) {
+        var element = list[index];
+        var transformed = this.transformAny(element);
+        if (builder != null || element != transformed) {
+          if (builder == null) {
+            builder = list.slice(0, index);
+          }
+          if (transformed instanceof AnonBlock)
+            ($__51 = builder).push.apply($__51, $traceurRuntime.toObject(transformed.statements));
+          else
+            builder.push(transformed);
+        }
+      }
+      return builder || list;
+    },
+    transformStateMachine: function(tree) {
+      throw Error('State machines should not live outside of the GeneratorTransformer.');
+    },
+    transformAnnotation: function(tree) {
+      var name = this.transformAny(tree.name);
+      var args = this.transformAny(tree.args);
+      if (name === tree.name && args === tree.args) {
+        return tree;
+      }
+      return new Annotation(tree.location, name, args);
+    },
+    transformAnonBlock: function(tree) {
+      var statements = this.transformList(tree.statements);
+      if (statements === tree.statements) {
+        return tree;
+      }
+      return new AnonBlock(tree.location, statements);
+    },
+    transformArgumentList: function(tree) {
+      var args = this.transformList(tree.args);
+      if (args === tree.args) {
+        return tree;
+      }
+      return new ArgumentList(tree.location, args);
+    },
+    transformArrayComprehension: function(tree) {
+      var comprehensionList = this.transformList(tree.comprehensionList);
+      var expression = this.transformAny(tree.expression);
+      if (comprehensionList === tree.comprehensionList && expression === tree.expression) {
+        return tree;
+      }
+      return new ArrayComprehension(tree.location, comprehensionList, expression);
+    },
+    transformArrayLiteralExpression: function(tree) {
+      var elements = this.transformList(tree.elements);
+      if (elements === tree.elements) {
+        return tree;
+      }
+      return new ArrayLiteralExpression(tree.location, elements);
+    },
+    transformArrayPattern: function(tree) {
+      var elements = this.transformList(tree.elements);
+      if (elements === tree.elements) {
+        return tree;
+      }
+      return new ArrayPattern(tree.location, elements);
+    },
+    transformArrowFunctionExpression: function(tree) {
+      var formalParameters = this.transformAny(tree.formalParameters);
+      var functionBody = this.transformAny(tree.functionBody);
+      if (formalParameters === tree.formalParameters && functionBody === tree.functionBody) {
+        return tree;
+      }
+      return new ArrowFunctionExpression(tree.location, formalParameters, functionBody);
+    },
+    transformAwaitStatement: function(tree) {
+      var expression = this.transformAny(tree.expression);
+      if (expression === tree.expression) {
+        return tree;
+      }
+      return new AwaitStatement(tree.location, tree.identifier, expression);
+    },
+    transformBinaryOperator: function(tree) {
+      var left = this.transformAny(tree.left);
+      var right = this.transformAny(tree.right);
+      if (left === tree.left && right === tree.right) {
+        return tree;
+      }
+      return new BinaryOperator(tree.location, left, tree.operator, right);
+    },
+    transformBindingElement: function(tree) {
+      var binding = this.transformAny(tree.binding);
+      var initialiser = this.transformAny(tree.initialiser);
+      if (binding === tree.binding && initialiser === tree.initialiser) {
+        return tree;
+      }
+      return new BindingElement(tree.location, binding, initialiser);
+    },
+    transformBindingIdentifier: function(tree) {
+      return tree;
+    },
+    transformBlock: function(tree) {
+      var statements = this.transformList(tree.statements);
+      if (statements === tree.statements) {
+        return tree;
+      }
+      return new Block(tree.location, statements);
+    },
+    transformBreakStatement: function(tree) {
+      return tree;
+    },
+    transformCallExpression: function(tree) {
+      var operand = this.transformAny(tree.operand);
+      var args = this.transformAny(tree.args);
+      if (operand === tree.operand && args === tree.args) {
+        return tree;
+      }
+      return new CallExpression(tree.location, operand, args);
+    },
+    transformCaseClause: function(tree) {
+      var expression = this.transformAny(tree.expression);
+      var statements = this.transformList(tree.statements);
+      if (expression === tree.expression && statements === tree.statements) {
+        return tree;
+      }
+      return new CaseClause(tree.location, expression, statements);
+    },
+    transformCatch: function(tree) {
+      var binding = this.transformAny(tree.binding);
+      var catchBody = this.transformAny(tree.catchBody);
+      if (binding === tree.binding && catchBody === tree.catchBody) {
+        return tree;
+      }
+      return new Catch(tree.location, binding, catchBody);
+    },
+    transformClassDeclaration: function(tree) {
+      var name = this.transformAny(tree.name);
+      var superClass = this.transformAny(tree.superClass);
+      var elements = this.transformList(tree.elements);
+      var annotations = this.transformList(tree.annotations);
+      if (name === tree.name && superClass === tree.superClass && elements === tree.elements && annotations === tree.annotations) {
+        return tree;
+      }
+      return new ClassDeclaration(tree.location, name, superClass, elements, annotations);
+    },
+    transformClassExpression: function(tree) {
+      var name = this.transformAny(tree.name);
+      var superClass = this.transformAny(tree.superClass);
+      var elements = this.transformList(tree.elements);
+      var annotations = this.transformList(tree.annotations);
+      if (name === tree.name && superClass === tree.superClass && elements === tree.elements && annotations === tree.annotations) {
+        return tree;
+      }
+      return new ClassExpression(tree.location, name, superClass, elements, annotations);
+    },
+    transformCommaExpression: function(tree) {
+      var expressions = this.transformList(tree.expressions);
+      if (expressions === tree.expressions) {
+        return tree;
+      }
+      return new CommaExpression(tree.location, expressions);
+    },
+    transformComprehensionFor: function(tree) {
+      var left = this.transformAny(tree.left);
+      var iterator = this.transformAny(tree.iterator);
+      if (left === tree.left && iterator === tree.iterator) {
+        return tree;
+      }
+      return new ComprehensionFor(tree.location, left, iterator);
+    },
+    transformComprehensionIf: function(tree) {
+      var expression = this.transformAny(tree.expression);
+      if (expression === tree.expression) {
+        return tree;
+      }
+      return new ComprehensionIf(tree.location, expression);
+    },
+    transformComputedPropertyName: function(tree) {
+      var expression = this.transformAny(tree.expression);
+      if (expression === tree.expression) {
+        return tree;
+      }
+      return new ComputedPropertyName(tree.location, expression);
+    },
+    transformConditionalExpression: function(tree) {
+      var condition = this.transformAny(tree.condition);
+      var left = this.transformAny(tree.left);
+      var right = this.transformAny(tree.right);
+      if (condition === tree.condition && left === tree.left && right === tree.right) {
+        return tree;
+      }
+      return new ConditionalExpression(tree.location, condition, left, right);
+    },
+    transformContinueStatement: function(tree) {
+      return tree;
+    },
+    transformCoverFormals: function(tree) {
+      var expressions = this.transformList(tree.expressions);
+      if (expressions === tree.expressions) {
+        return tree;
+      }
+      return new CoverFormals(tree.location, expressions);
+    },
+    transformCoverInitialisedName: function(tree) {
+      var initialiser = this.transformAny(tree.initialiser);
+      if (initialiser === tree.initialiser) {
+        return tree;
+      }
+      return new CoverInitialisedName(tree.location, tree.name, tree.equalToken, initialiser);
+    },
+    transformDebuggerStatement: function(tree) {
+      return tree;
+    },
+    transformDefaultClause: function(tree) {
+      var statements = this.transformList(tree.statements);
+      if (statements === tree.statements) {
+        return tree;
+      }
+      return new DefaultClause(tree.location, statements);
+    },
+    transformDoWhileStatement: function(tree) {
+      var body = this.transformAny(tree.body);
+      var condition = this.transformAny(tree.condition);
+      if (body === tree.body && condition === tree.condition) {
+        return tree;
+      }
+      return new DoWhileStatement(tree.location, body, condition);
+    },
+    transformEmptyStatement: function(tree) {
+      return tree;
+    },
+    transformExportDeclaration: function(tree) {
+      var declaration = this.transformAny(tree.declaration);
+      var annotations = this.transformList(tree.annotations);
+      if (declaration === tree.declaration && annotations === tree.annotations) {
+        return tree;
+      }
+      return new ExportDeclaration(tree.location, declaration, annotations);
+    },
+    transformExportDefault: function(tree) {
+      var expression = this.transformAny(tree.expression);
+      if (expression === tree.expression) {
+        return tree;
+      }
+      return new ExportDefault(tree.location, expression);
+    },
+    transformExportSpecifier: function(tree) {
+      return tree;
+    },
+    transformExportSpecifierSet: function(tree) {
+      var specifiers = this.transformList(tree.specifiers);
+      if (specifiers === tree.specifiers) {
+        return tree;
+      }
+      return new ExportSpecifierSet(tree.location, specifiers);
+    },
+    transformExportStar: function(tree) {
+      return tree;
+    },
+    transformExpressionStatement: function(tree) {
+      var expression = this.transformAny(tree.expression);
+      if (expression === tree.expression) {
+        return tree;
+      }
+      return new ExpressionStatement(tree.location, expression);
+    },
+    transformFinally: function(tree) {
+      var block = this.transformAny(tree.block);
+      if (block === tree.block) {
+        return tree;
+      }
+      return new Finally(tree.location, block);
+    },
+    transformForInStatement: function(tree) {
+      var initialiser = this.transformAny(tree.initialiser);
+      var collection = this.transformAny(tree.collection);
+      var body = this.transformAny(tree.body);
+      if (initialiser === tree.initialiser && collection === tree.collection && body === tree.body) {
+        return tree;
+      }
+      return new ForInStatement(tree.location, initialiser, collection, body);
+    },
+    transformForOfStatement: function(tree) {
+      var initialiser = this.transformAny(tree.initialiser);
+      var collection = this.transformAny(tree.collection);
+      var body = this.transformAny(tree.body);
+      if (initialiser === tree.initialiser && collection === tree.collection && body === tree.body) {
+        return tree;
+      }
+      return new ForOfStatement(tree.location, initialiser, collection, body);
+    },
+    transformForStatement: function(tree) {
+      var initialiser = this.transformAny(tree.initialiser);
+      var condition = this.transformAny(tree.condition);
+      var increment = this.transformAny(tree.increment);
+      var body = this.transformAny(tree.body);
+      if (initialiser === tree.initialiser && condition === tree.condition && increment === tree.increment && body === tree.body) {
+        return tree;
+      }
+      return new ForStatement(tree.location, initialiser, condition, increment, body);
+    },
+    transformFormalParameter: function(tree) {
+      var parameter = this.transformAny(tree.parameter);
+      var typeAnnotation = this.transformAny(tree.typeAnnotation);
+      var annotations = this.transformList(tree.annotations);
+      if (parameter === tree.parameter && typeAnnotation === tree.typeAnnotation && annotations === tree.annotations) {
+        return tree;
+      }
+      return new FormalParameter(tree.location, parameter, typeAnnotation, annotations);
+    },
+    transformFormalParameterList: function(tree) {
+      var parameters = this.transformList(tree.parameters);
+      if (parameters === tree.parameters) {
+        return tree;
+      }
+      return new FormalParameterList(tree.location, parameters);
+    },
+    transformFunctionBody: function(tree) {
+      var statements = this.transformList(tree.statements);
+      if (statements === tree.statements) {
+        return tree;
+      }
+      return new FunctionBody(tree.location, statements);
+    },
+    transformFunctionDeclaration: function(tree) {
+      var name = this.transformAny(tree.name);
+      var formalParameterList = this.transformAny(tree.formalParameterList);
+      var typeAnnotation = this.transformAny(tree.typeAnnotation);
+      var annotations = this.transformList(tree.annotations);
+      var functionBody = this.transformAny(tree.functionBody);
+      if (name === tree.name && formalParameterList === tree.formalParameterList && typeAnnotation === tree.typeAnnotation && annotations === tree.annotations && functionBody === tree.functionBody) {
+        return tree;
+      }
+      return new FunctionDeclaration(tree.location, name, tree.isGenerator, formalParameterList, typeAnnotation, annotations, functionBody);
+    },
+    transformFunctionExpression: function(tree) {
+      var name = this.transformAny(tree.name);
+      var formalParameterList = this.transformAny(tree.formalParameterList);
+      var typeAnnotation = this.transformAny(tree.typeAnnotation);
+      var annotations = this.transformList(tree.annotations);
+      var functionBody = this.transformAny(tree.functionBody);
+      if (name === tree.name && formalParameterList === tree.formalParameterList && typeAnnotation === tree.typeAnnotation && annotations === tree.annotations && functionBody === tree.functionBody) {
+        return tree;
+      }
+      return new FunctionExpression(tree.location, name, tree.isGenerator, formalParameterList, typeAnnotation, annotations, functionBody);
+    },
+    transformGeneratorComprehension: function(tree) {
+      var comprehensionList = this.transformList(tree.comprehensionList);
+      var expression = this.transformAny(tree.expression);
+      if (comprehensionList === tree.comprehensionList && expression === tree.expression) {
+        return tree;
+      }
+      return new GeneratorComprehension(tree.location, comprehensionList, expression);
+    },
+    transformGetAccessor: function(tree) {
+      var name = this.transformAny(tree.name);
+      var typeAnnotation = this.transformAny(tree.typeAnnotation);
+      var annotations = this.transformList(tree.annotations);
+      var body = this.transformAny(tree.body);
+      if (name === tree.name && typeAnnotation === tree.typeAnnotation && annotations === tree.annotations && body === tree.body) {
+        return tree;
+      }
+      return new GetAccessor(tree.location, tree.isStatic, name, typeAnnotation, annotations, body);
+    },
+    transformIdentifierExpression: function(tree) {
+      return tree;
+    },
+    transformIfStatement: function(tree) {
+      var condition = this.transformAny(tree.condition);
+      var ifClause = this.transformAny(tree.ifClause);
+      var elseClause = this.transformAny(tree.elseClause);
+      if (condition === tree.condition && ifClause === tree.ifClause && elseClause === tree.elseClause) {
+        return tree;
+      }
+      return new IfStatement(tree.location, condition, ifClause, elseClause);
+    },
+    transformImportedBinding: function(tree) {
+      var binding = this.transformAny(tree.binding);
+      if (binding === tree.binding) {
+        return tree;
+      }
+      return new ImportedBinding(tree.location, binding);
+    },
+    transformImportDeclaration: function(tree) {
+      var importClause = this.transformAny(tree.importClause);
+      var moduleSpecifier = this.transformAny(tree.moduleSpecifier);
+      if (importClause === tree.importClause && moduleSpecifier === tree.moduleSpecifier) {
+        return tree;
+      }
+      return new ImportDeclaration(tree.location, importClause, moduleSpecifier);
+    },
+    transformImportSpecifier: function(tree) {
+      return tree;
+    },
+    transformImportSpecifierSet: function(tree) {
+      var specifiers = this.transformList(tree.specifiers);
+      if (specifiers === tree.specifiers) {
+        return tree;
+      }
+      return new ImportSpecifierSet(tree.location, specifiers);
+    },
+    transformLabelledStatement: function(tree) {
+      var statement = this.transformAny(tree.statement);
+      if (statement === tree.statement) {
+        return tree;
+      }
+      return new LabelledStatement(tree.location, tree.name, statement);
+    },
+    transformLiteralExpression: function(tree) {
+      return tree;
+    },
+    transformLiteralPropertyName: function(tree) {
+      return tree;
+    },
+    transformMemberExpression: function(tree) {
+      var operand = this.transformAny(tree.operand);
+      if (operand === tree.operand) {
+        return tree;
+      }
+      return new MemberExpression(tree.location, operand, tree.memberName);
+    },
+    transformMemberLookupExpression: function(tree) {
+      var operand = this.transformAny(tree.operand);
+      var memberExpression = this.transformAny(tree.memberExpression);
+      if (operand === tree.operand && memberExpression === tree.memberExpression) {
+        return tree;
+      }
+      return new MemberLookupExpression(tree.location, operand, memberExpression);
+    },
+    transformModule: function(tree) {
+      var scriptItemList = this.transformList(tree.scriptItemList);
+      if (scriptItemList === tree.scriptItemList) {
+        return tree;
+      }
+      return new Module(tree.location, scriptItemList, tree.moduleName);
+    },
+    transformModuleDeclaration: function(tree) {
+      var expression = this.transformAny(tree.expression);
+      if (expression === tree.expression) {
+        return tree;
+      }
+      return new ModuleDeclaration(tree.location, tree.identifier, expression);
+    },
+    transformModuleSpecifier: function(tree) {
+      return tree;
+    },
+    transformNamedExport: function(tree) {
+      var moduleSpecifier = this.transformAny(tree.moduleSpecifier);
+      var specifierSet = this.transformAny(tree.specifierSet);
+      if (moduleSpecifier === tree.moduleSpecifier && specifierSet === tree.specifierSet) {
+        return tree;
+      }
+      return new NamedExport(tree.location, moduleSpecifier, specifierSet);
+    },
+    transformNewExpression: function(tree) {
+      var operand = this.transformAny(tree.operand);
+      var args = this.transformAny(tree.args);
+      if (operand === tree.operand && args === tree.args) {
+        return tree;
+      }
+      return new NewExpression(tree.location, operand, args);
+    },
+    transformObjectLiteralExpression: function(tree) {
+      var propertyNameAndValues = this.transformList(tree.propertyNameAndValues);
+      if (propertyNameAndValues === tree.propertyNameAndValues) {
+        return tree;
+      }
+      return new ObjectLiteralExpression(tree.location, propertyNameAndValues);
+    },
+    transformObjectPattern: function(tree) {
+      var fields = this.transformList(tree.fields);
+      if (fields === tree.fields) {
+        return tree;
+      }
+      return new ObjectPattern(tree.location, fields);
+    },
+    transformObjectPatternField: function(tree) {
+      var name = this.transformAny(tree.name);
+      var element = this.transformAny(tree.element);
+      if (name === tree.name && element === tree.element) {
+        return tree;
+      }
+      return new ObjectPatternField(tree.location, name, element);
+    },
+    transformParenExpression: function(tree) {
+      var expression = this.transformAny(tree.expression);
+      if (expression === tree.expression) {
+        return tree;
+      }
+      return new ParenExpression(tree.location, expression);
+    },
+    transformPostfixExpression: function(tree) {
+      var operand = this.transformAny(tree.operand);
+      if (operand === tree.operand) {
+        return tree;
+      }
+      return new PostfixExpression(tree.location, operand, tree.operator);
+    },
+    transformPredefinedType: function(tree) {
+      return tree;
+    },
+    transformScript: function(tree) {
+      var scriptItemList = this.transformList(tree.scriptItemList);
+      if (scriptItemList === tree.scriptItemList) {
+        return tree;
+      }
+      return new Script(tree.location, scriptItemList, tree.moduleName);
+    },
+    transformPropertyMethodAssignment: function(tree) {
+      var name = this.transformAny(tree.name);
+      var formalParameterList = this.transformAny(tree.formalParameterList);
+      var typeAnnotation = this.transformAny(tree.typeAnnotation);
+      var annotations = this.transformList(tree.annotations);
+      var functionBody = this.transformAny(tree.functionBody);
+      if (name === tree.name && formalParameterList === tree.formalParameterList && typeAnnotation === tree.typeAnnotation && annotations === tree.annotations && functionBody === tree.functionBody) {
+        return tree;
+      }
+      return new PropertyMethodAssignment(tree.location, tree.isStatic, tree.isGenerator, name, formalParameterList, typeAnnotation, annotations, functionBody);
+    },
+    transformPropertyNameAssignment: function(tree) {
+      var name = this.transformAny(tree.name);
+      var value = this.transformAny(tree.value);
+      if (name === tree.name && value === tree.value) {
+        return tree;
+      }
+      return new PropertyNameAssignment(tree.location, name, value);
+    },
+    transformPropertyNameShorthand: function(tree) {
+      return tree;
+    },
+    transformRestParameter: function(tree) {
+      var identifier = this.transformAny(tree.identifier);
+      if (identifier === tree.identifier) {
+        return tree;
+      }
+      return new RestParameter(tree.location, identifier);
+    },
+    transformReturnStatement: function(tree) {
+      var expression = this.transformAny(tree.expression);
+      if (expression === tree.expression) {
+        return tree;
+      }
+      return new ReturnStatement(tree.location, expression);
+    },
+    transformSetAccessor: function(tree) {
+      var name = this.transformAny(tree.name);
+      var parameter = this.transformAny(tree.parameter);
+      var annotations = this.transformList(tree.annotations);
+      var body = this.transformAny(tree.body);
+      if (name === tree.name && parameter === tree.parameter && annotations === tree.annotations && body === tree.body) {
+        return tree;
+      }
+      return new SetAccessor(tree.location, tree.isStatic, name, parameter, annotations, body);
+    },
+    transformSpreadExpression: function(tree) {
+      var expression = this.transformAny(tree.expression);
+      if (expression === tree.expression) {
+        return tree;
+      }
+      return new SpreadExpression(tree.location, expression);
+    },
+    transformSpreadPatternElement: function(tree) {
+      var lvalue = this.transformAny(tree.lvalue);
+      if (lvalue === tree.lvalue) {
+        return tree;
+      }
+      return new SpreadPatternElement(tree.location, lvalue);
+    },
+    transformSuperExpression: function(tree) {
+      return tree;
+    },
+    transformSwitchStatement: function(tree) {
+      var expression = this.transformAny(tree.expression);
+      var caseClauses = this.transformList(tree.caseClauses);
+      if (expression === tree.expression && caseClauses === tree.caseClauses) {
+        return tree;
+      }
+      return new SwitchStatement(tree.location, expression, caseClauses);
+    },
+    transformSyntaxErrorTree: function(tree) {
+      return tree;
+    },
+    transformTemplateLiteralExpression: function(tree) {
+      var operand = this.transformAny(tree.operand);
+      var elements = this.transformList(tree.elements);
+      if (operand === tree.operand && elements === tree.elements) {
+        return tree;
+      }
+      return new TemplateLiteralExpression(tree.location, operand, elements);
+    },
+    transformTemplateLiteralPortion: function(tree) {
+      return tree;
+    },
+    transformTemplateSubstitution: function(tree) {
+      var expression = this.transformAny(tree.expression);
+      if (expression === tree.expression) {
+        return tree;
+      }
+      return new TemplateSubstitution(tree.location, expression);
+    },
+    transformThisExpression: function(tree) {
+      return tree;
+    },
+    transformThrowStatement: function(tree) {
+      var value = this.transformAny(tree.value);
+      if (value === tree.value) {
+        return tree;
+      }
+      return new ThrowStatement(tree.location, value);
+    },
+    transformTryStatement: function(tree) {
+      var body = this.transformAny(tree.body);
+      var catchBlock = this.transformAny(tree.catchBlock);
+      var finallyBlock = this.transformAny(tree.finallyBlock);
+      if (body === tree.body && catchBlock === tree.catchBlock && finallyBlock === tree.finallyBlock) {
+        return tree;
+      }
+      return new TryStatement(tree.location, body, catchBlock, finallyBlock);
+    },
+    transformTypeName: function(tree) {
+      var moduleName = this.transformAny(tree.moduleName);
+      if (moduleName === tree.moduleName) {
+        return tree;
+      }
+      return new TypeName(tree.location, moduleName, tree.name);
+    },
+    transformUnaryExpression: function(tree) {
+      var operand = this.transformAny(tree.operand);
+      if (operand === tree.operand) {
+        return tree;
+      }
+      return new UnaryExpression(tree.location, tree.operator, operand);
+    },
+    transformVariableDeclaration: function(tree) {
+      var lvalue = this.transformAny(tree.lvalue);
+      var typeAnnotation = this.transformAny(tree.typeAnnotation);
+      var initialiser = this.transformAny(tree.initialiser);
+      if (lvalue === tree.lvalue && typeAnnotation === tree.typeAnnotation && initialiser === tree.initialiser) {
+        return tree;
+      }
+      return new VariableDeclaration(tree.location, lvalue, typeAnnotation, initialiser);
+    },
+    transformVariableDeclarationList: function(tree) {
+      var declarations = this.transformList(tree.declarations);
+      if (declarations === tree.declarations) {
+        return tree;
+      }
+      return new VariableDeclarationList(tree.location, tree.declarationType, declarations);
+    },
+    transformVariableStatement: function(tree) {
+      var declarations = this.transformAny(tree.declarations);
+      if (declarations === tree.declarations) {
+        return tree;
+      }
+      return new VariableStatement(tree.location, declarations);
+    },
+    transformWhileStatement: function(tree) {
+      var condition = this.transformAny(tree.condition);
+      var body = this.transformAny(tree.body);
+      if (condition === tree.condition && body === tree.body) {
+        return tree;
+      }
+      return new WhileStatement(tree.location, condition, body);
+    },
+    transformWithStatement: function(tree) {
+      var expression = this.transformAny(tree.expression);
+      var body = this.transformAny(tree.body);
+      if (expression === tree.expression && body === tree.body) {
+        return tree;
+      }
+      return new WithStatement(tree.location, expression, body);
+    },
+    transformYieldExpression: function(tree) {
+      var expression = this.transformAny(tree.expression);
+      if (expression === tree.expression) {
+        return tree;
+      }
+      return new YieldExpression(tree.location, expression, tree.isYieldFor);
+    }
+  }, {});
+  return {get ParseTreeTransformer() {
+      return ParseTreeTransformer;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/AssignmentPatternTransformer", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/AssignmentPatternTransformer";
+  var ParseTreeTransformer = System.get("traceur@0.0.32/src/codegeneration/ParseTreeTransformer").ParseTreeTransformer;
+  var $__53 = System.get("traceur@0.0.32/src/syntax/trees/ParseTrees"),
+      ArrayPattern = $__53.ArrayPattern,
+      BindingElement = $__53.BindingElement,
+      BindingIdentifier = $__53.BindingIdentifier,
+      IdentifierExpression = $__53.IdentifierExpression,
+      ObjectPattern = $__53.ObjectPattern,
+      ObjectPatternField = $__53.ObjectPatternField,
+      SpreadPatternElement = $__53.SpreadPatternElement;
+  var EQUAL = System.get("traceur@0.0.32/src/syntax/TokenType").EQUAL;
+  var AssignmentPatternTransformerError = function AssignmentPatternTransformerError() {
+    $traceurRuntime.defaultSuperCall(this, $AssignmentPatternTransformerError.prototype, arguments);
+  };
+  var $AssignmentPatternTransformerError = AssignmentPatternTransformerError;
+  ($traceurRuntime.createClass)(AssignmentPatternTransformerError, {}, {}, Error);
+  var AssignmentPatternTransformer = function AssignmentPatternTransformer() {
+    $traceurRuntime.defaultSuperCall(this, $AssignmentPatternTransformer.prototype, arguments);
+  };
+  var $AssignmentPatternTransformer = AssignmentPatternTransformer;
+  ($traceurRuntime.createClass)(AssignmentPatternTransformer, {
+    transformBinaryOperator: function(tree) {
+      if (tree.operator.type !== EQUAL)
+        throw new AssignmentPatternTransformerError();
+      var bindingElement = this.transformAny(tree.left);
+      if (bindingElement instanceof BindingElement)
+        bindingElement = bindingElement.binding;
+      return new BindingElement(tree.location, bindingElement, tree.right);
+    },
+    transformArrayLiteralExpression: function(tree) {
+      var elements = this.transformList(tree.elements);
+      return new ArrayPattern(tree.location, elements);
+    },
+    transformCoverInitialisedName: function(tree) {
+      return new BindingElement(tree.location, new BindingIdentifier(tree.name.location, tree.name), this.transformAny(tree.initialiser));
+    },
+    transformObjectLiteralExpression: function(tree) {
+      var propertyNameAndValues = this.transformList(tree.propertyNameAndValues);
+      return new ObjectPattern(tree.location, propertyNameAndValues);
+    },
+    transformPropertyNameAssignment: function(tree) {
+      return new ObjectPatternField(tree.location, tree.name, this.transformAny(tree.value));
+    },
+    transformPropertyNameShorthand: function(tree) {
+      return new IdentifierExpression(tree.location, tree.name);
+    },
+    transformSpreadExpression: function(tree) {
+      return new SpreadPatternElement(tree.location, tree.expression);
+    },
+    transformSyntaxErrorTree: function(tree) {
+      throw new AssignmentPatternTransformerError();
+    }
+  }, {}, ParseTreeTransformer);
+  return {
+    get AssignmentPatternTransformerError() {
+      return AssignmentPatternTransformerError;
+    },
+    get AssignmentPatternTransformer() {
+      return AssignmentPatternTransformer;
+    }
+  };
+});
+System.register("traceur@0.0.32/src/codegeneration/CoverFormalsTransformer", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/CoverFormalsTransformer";
+  var ParseTreeTransformer = System.get("traceur@0.0.32/src/codegeneration/ParseTreeTransformer").ParseTreeTransformer;
+  var $__55 = System.get("traceur@0.0.32/src/syntax/trees/ParseTrees"),
+      ArrayPattern = $__55.ArrayPattern,
+      BindingElement = $__55.BindingElement,
+      BindingIdentifier = $__55.BindingIdentifier,
+      CommaExpression = $__55.CommaExpression,
+      FormalParameter = $__55.FormalParameter,
+      FormalParameterList = $__55.FormalParameterList,
+      ObjectPattern = $__55.ObjectPattern,
+      ObjectPatternField = $__55.ObjectPatternField,
+      ParenExpression = $__55.ParenExpression,
+      RestParameter = $__55.RestParameter,
+      SpreadPatternElement = $__55.SpreadPatternElement;
+  var EQUAL = System.get("traceur@0.0.32/src/syntax/TokenType").EQUAL;
+  var IDENTIFIER_EXPRESSION = System.get("traceur@0.0.32/src/syntax/trees/ParseTreeType").IDENTIFIER_EXPRESSION;
+  var AssignmentPatternTransformerError = System.get("traceur@0.0.32/src/codegeneration/AssignmentPatternTransformer").AssignmentPatternTransformerError;
+  var CoverFormalsTransformerError = function CoverFormalsTransformerError(location, message) {
+    this.location = location;
+    this.message = message;
+  };
+  ($traceurRuntime.createClass)(CoverFormalsTransformerError, {}, {}, Error);
+  var ToFormalParametersTransformer = function ToFormalParametersTransformer() {
+    this.isValid = true;
+    this.inArrayPattern_ = false;
+  };
+  ($traceurRuntime.createClass)(ToFormalParametersTransformer, {
+    transformCoverFormals: function(tree) {
+      var expressions = this.transformList(tree.expressions).map((function(expression) {
+        return new FormalParameter(expression.location, expression, null, []);
+      }));
+      return new FormalParameterList(tree.location, expressions);
+    },
+    transformIdentifierExpression: function(tree) {
+      return new BindingElement(tree.location, new BindingIdentifier(tree.location, tree.identifierToken), null);
+    },
+    transformBinaryOperator: function(tree) {
+      if (tree.operator.type !== EQUAL)
+        throw new CoverFormalsTransformerError(tree.operator, ("Unexpected token " + tree.operator));
+      var bindingElement = this.transformAny(tree.left);
+      if (bindingElement instanceof BindingElement)
+        bindingElement = bindingElement.binding;
+      return new BindingElement(tree.location, bindingElement, tree.right);
+    },
+    transformArrayLiteralExpression: function(tree) {
+      var wasInArrayPattern = this.inArrayPattern_;
+      this.inArrayPattern_ = true;
+      var elements = this.transformList(tree.elements);
+      this.inArrayPattern_ = wasInArrayPattern;
+      var okIndex = elements.length - 1;
+      for (var i = 0; i < okIndex; i++) {
+        if (elements[i] instanceof SpreadPatternElement)
+          throw new CoverFormalsTransformerError(elements[i].location, 'Unexpected token ...');
+      }
+      return new BindingElement(tree.location, new ArrayPattern(tree.location, elements), null);
+    },
+    transformObjectLiteralExpression: function(tree) {
+      var propertyNameAndValues = this.transformList(tree.propertyNameAndValues);
+      return new BindingElement(tree.location, new ObjectPattern(tree.location, propertyNameAndValues), null);
+    },
+    transformCoverInitialisedName: function(tree) {
+      return new BindingElement(tree.location, new BindingIdentifier(tree.location, tree.name), tree.initialiser);
+    },
+    transformPropertyNameAssignment: function(tree) {
+      return new ObjectPatternField(tree.location, tree.name, this.transformAny(tree.value));
+    },
+    transformPropertyNameShorthand: function(tree) {
+      return new BindingElement(tree.location, new BindingIdentifier(tree.location, tree.name), null);
+    },
+    transformSpreadExpression: function(tree) {
+      if (tree.expression.type !== IDENTIFIER_EXPRESSION)
+        throw new CoverFormalsTransformerError(tree.expression.location, 'identifier expected');
+      var bindingIdentifier = new BindingIdentifier(tree.expression.location, tree.expression.identifierToken);
+      if (this.inArrayPattern_)
+        return new SpreadPatternElement(tree.location, bindingIdentifier);
+      return new RestParameter(tree.location, bindingIdentifier);
+    },
+    transformSyntaxErrorTree: function(tree) {
+      throw new AssignmentPatternTransformerError();
+    }
+  }, {}, ParseTreeTransformer);
+  function toParenExpression(tree) {
+    var expressions = tree.expressions;
+    var length = expressions.length;
+    if (length === 0)
+      throw new CoverFormalsTransformerError(tree.location, 'Unexpected token )');
+    for (var i = 0; i < length; i++) {
+      if (expressions[i].isRestParameter())
+        throw new CoverFormalsTransformerError(expressions[i].location, 'Unexpected token ...');
+    }
+    var expression;
+    if (expressions.length > 1) {
+      expression = new CommaExpression(expressions[0].location, expressions);
+    } else {
+      expression = expressions[0];
+    }
+    return new ParenExpression(tree.location, expression);
+  }
+  function toFormalParameters(tree) {
+    var transformer = new ToFormalParametersTransformer();
+    return transformer.transformAny(tree);
+  }
+  return {
+    get CoverFormalsTransformerError() {
+      return CoverFormalsTransformerError;
+    },
+    get toParenExpression() {
+      return toParenExpression;
+    },
+    get toFormalParameters() {
+      return toFormalParameters;
+    }
+  };
+});
+System.register("traceur@0.0.32/src/staticsemantics/StrictParams", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/staticsemantics/StrictParams";
+  var ParseTreeVisitor = System.get("traceur@0.0.32/src/syntax/ParseTreeVisitor").ParseTreeVisitor;
+  var isStrictKeyword = System.get("traceur@0.0.32/src/syntax/Keywords").isStrictKeyword;
+  var StrictParams = function StrictParams(errorReporter) {
+    $traceurRuntime.superCall(this, $StrictParams.prototype, "constructor", []);
+    this.errorReporter = errorReporter;
+  };
+  var $StrictParams = StrictParams;
+  ($traceurRuntime.createClass)(StrictParams, {visitBindingIdentifier: function(tree) {
+      var name = tree.identifierToken.toString();
+      if (isStrictKeyword(name)) {
+        this.errorReporter.reportError(tree.location.start, (name + " is a reserved identifier"));
+      }
+    }}, {visit: function(tree, errorReporter) {
+      new $StrictParams(errorReporter).visitAny(tree);
+    }}, ParseTreeVisitor);
+  return {get StrictParams() {
+      return StrictParams;
+    }};
+});
+System.register("traceur@0.0.32/src/util/SourceRange", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/util/SourceRange";
+  var SourceRange = function SourceRange(start, end) {
+    this.start = start;
+    this.end = end;
+  };
+  ($traceurRuntime.createClass)(SourceRange, {toString: function() {
+      var str = this.start.source.contents;
+      return str.slice(this.start.offset, this.end.offset);
+    }}, {});
+  return {get SourceRange() {
+      return SourceRange;
+    }};
+});
+System.register("traceur@0.0.32/src/util/ErrorReporter", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/util/ErrorReporter";
+  var ErrorReporter = function ErrorReporter() {
+    this.hadError_ = false;
+  };
+  ($traceurRuntime.createClass)(ErrorReporter, {
+    reportError: function(location, message) {
+      this.hadError_ = true;
+      this.reportMessageInternal(location, message);
+    },
+    reportMessageInternal: function(location, message) {
+      if (location)
+        message = (location + ": " + message);
+      console.error(message);
+    },
+    hadError: function() {
+      return this.hadError_;
+    },
+    clearError: function() {
+      this.hadError_ = false;
+    }
+  }, {});
+  function format(location, text) {
+    var args = arguments[2];
+    var i = 0;
+    text = text.replace(/%./g, function(s) {
+      switch (s) {
+        case '%s':
+          return args && args[i++];
+        case '%%':
+          return '%';
+      }
+      return s;
+    });
+    if (location)
+      text = (location + ": " + text);
+    return text;
+  }
+  ;
+  ErrorReporter.format = format;
+  return {
+    get ErrorReporter() {
+      return ErrorReporter;
+    },
+    get format() {
+      return format;
+    }
+  };
+});
+System.register("traceur@0.0.32/src/util/SyntaxErrorReporter", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/util/SyntaxErrorReporter";
+  var $__61 = System.get("traceur@0.0.32/src/util/ErrorReporter"),
+      ErrorReporter = $__61.ErrorReporter,
+      format = $__61.format;
+  var SyntaxErrorReporter = function SyntaxErrorReporter() {
+    $traceurRuntime.defaultSuperCall(this, $SyntaxErrorReporter.prototype, arguments);
+  };
+  var $SyntaxErrorReporter = SyntaxErrorReporter;
+  ($traceurRuntime.createClass)(SyntaxErrorReporter, {reportMessageInternal: function(location, message) {
+      var s = format(location, message);
+      throw new SyntaxError(s);
+    }}, {}, ErrorReporter);
+  return {get SyntaxErrorReporter() {
+      return SyntaxErrorReporter;
+    }};
+});
+System.register("traceur@0.0.32/src/syntax/Parser", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/syntax/Parser";
+  var $__65 = System.get("traceur@0.0.32/src/codegeneration/AssignmentPatternTransformer"),
+      AssignmentPatternTransformer = $__65.AssignmentPatternTransformer,
+      AssignmentPatternTransformerError = $__65.AssignmentPatternTransformerError;
+  var $__65 = System.get("traceur@0.0.32/src/codegeneration/CoverFormalsTransformer"),
+      toFormalParameters = $__65.toFormalParameters,
+      toParenExpression = $__65.toParenExpression,
+      CoverFormalsTransformerError = $__65.CoverFormalsTransformerError;
+  var IdentifierToken = System.get("traceur@0.0.32/src/syntax/IdentifierToken").IdentifierToken;
+  var $__65 = System.get("traceur@0.0.32/src/syntax/trees/ParseTreeType"),
+      ARRAY_LITERAL_EXPRESSION = $__65.ARRAY_LITERAL_EXPRESSION,
+      BINARY_OPERATOR = $__65.BINARY_OPERATOR,
+      CALL_EXPRESSION = $__65.CALL_EXPRESSION,
+      CLASS_DECLARATION = $__65.CLASS_DECLARATION,
+      COMMA_EXPRESSION = $__65.COMMA_EXPRESSION,
+      COMPUTED_PROPERTY_NAME = $__65.COMPUTED_PROPERTY_NAME,
+      COVER_FORMALS = $__65.COVER_FORMALS,
+      FORMAL_PARAMETER_LIST = $__65.FORMAL_PARAMETER_LIST,
+      FUNCTION_DECLARATION = $__65.FUNCTION_DECLARATION,
+      IDENTIFIER_EXPRESSION = $__65.IDENTIFIER_EXPRESSION,
+      LITERAL_PROPERTY_NAME = $__65.LITERAL_PROPERTY_NAME,
+      MEMBER_EXPRESSION = $__65.MEMBER_EXPRESSION,
+      MEMBER_LOOKUP_EXPRESSION = $__65.MEMBER_LOOKUP_EXPRESSION,
+      OBJECT_LITERAL_EXPRESSION = $__65.OBJECT_LITERAL_EXPRESSION,
+      PAREN_EXPRESSION = $__65.PAREN_EXPRESSION,
+      PROPERTY_NAME_ASSIGNMENT = $__65.PROPERTY_NAME_ASSIGNMENT,
+      REST_PARAMETER = $__65.REST_PARAMETER,
+      SYNTAX_ERROR_TREE = $__65.SYNTAX_ERROR_TREE;
+  var $__65 = System.get("traceur@0.0.32/src/syntax/PredefinedName"),
+      AS = $__65.AS,
+      FROM = $__65.FROM,
+      GET = $__65.GET,
+      MODULE = $__65.MODULE,
+      OF = $__65.OF,
+      SET = $__65.SET;
+  var SyntaxErrorReporter = System.get("traceur@0.0.32/src/util/SyntaxErrorReporter").SyntaxErrorReporter;
+  var Scanner = System.get("traceur@0.0.32/src/syntax/Scanner").Scanner;
+  var SourceRange = System.get("traceur@0.0.32/src/util/SourceRange").SourceRange;
+  var StrictParams = System.get("traceur@0.0.32/src/staticsemantics/StrictParams").StrictParams;
+  var $__65 = System.get("traceur@0.0.32/src/syntax/Token"),
+      Token = $__65.Token,
+      isAssignmentOperator = $__65.isAssignmentOperator;
+  var $__65 = System.get("traceur@0.0.32/src/options"),
+      parseOptions = $__65.parseOptions,
+      options = $__65.options;
+  var $__65 = System.get("traceur@0.0.32/src/syntax/TokenType"),
+      AMPERSAND = $__65.AMPERSAND,
+      AMPERSAND_EQUAL = $__65.AMPERSAND_EQUAL,
+      AND = $__65.AND,
+      ARROW = $__65.ARROW,
+      AT = $__65.AT,
+      AWAIT = $__65.AWAIT,
+      BACK_QUOTE = $__65.BACK_QUOTE,
+      BANG = $__65.BANG,
+      BAR = $__65.BAR,
+      BAR_EQUAL = $__65.BAR_EQUAL,
+      BREAK = $__65.BREAK,
+      CARET = $__65.CARET,
+      CARET_EQUAL = $__65.CARET_EQUAL,
+      CASE = $__65.CASE,
+      CATCH = $__65.CATCH,
+      CLASS = $__65.CLASS,
+      CLOSE_ANGLE = $__65.CLOSE_ANGLE,
+      CLOSE_CURLY = $__65.CLOSE_CURLY,
+      CLOSE_PAREN = $__65.CLOSE_PAREN,
+      CLOSE_SQUARE = $__65.CLOSE_SQUARE,
+      COLON = $__65.COLON,
+      COMMA = $__65.COMMA,
+      CONST = $__65.CONST,
+      CONTINUE = $__65.CONTINUE,
+      DEBUGGER = $__65.DEBUGGER,
+      DEFAULT = $__65.DEFAULT,
+      DELETE = $__65.DELETE,
+      DO = $__65.DO,
+      DOT_DOT_DOT = $__65.DOT_DOT_DOT,
+      ELSE = $__65.ELSE,
+      END_OF_FILE = $__65.END_OF_FILE,
+      ENUM = $__65.ENUM,
+      EQUAL = $__65.EQUAL,
+      EQUAL_EQUAL = $__65.EQUAL_EQUAL,
+      EQUAL_EQUAL_EQUAL = $__65.EQUAL_EQUAL_EQUAL,
+      ERROR = $__65.ERROR,
+      EXPORT = $__65.EXPORT,
+      EXTENDS = $__65.EXTENDS,
+      FALSE = $__65.FALSE,
+      FINALLY = $__65.FINALLY,
+      FOR = $__65.FOR,
+      FUNCTION = $__65.FUNCTION,
+      GREATER_EQUAL = $__65.GREATER_EQUAL,
+      IDENTIFIER = $__65.IDENTIFIER,
+      IF = $__65.IF,
+      IMPLEMENTS = $__65.IMPLEMENTS,
+      IMPORT = $__65.IMPORT,
+      IN = $__65.IN,
+      INSTANCEOF = $__65.INSTANCEOF,
+      INTERFACE = $__65.INTERFACE,
+      LEFT_SHIFT = $__65.LEFT_SHIFT,
+      LEFT_SHIFT_EQUAL = $__65.LEFT_SHIFT_EQUAL,
+      LESS_EQUAL = $__65.LESS_EQUAL,
+      LET = $__65.LET,
+      MINUS = $__65.MINUS,
+      MINUS_EQUAL = $__65.MINUS_EQUAL,
+      MINUS_MINUS = $__65.MINUS_MINUS,
+      NEW = $__65.NEW,
+      NO_SUBSTITUTION_TEMPLATE = $__65.NO_SUBSTITUTION_TEMPLATE,
+      NOT_EQUAL = $__65.NOT_EQUAL,
+      NOT_EQUAL_EQUAL = $__65.NOT_EQUAL_EQUAL,
+      NULL = $__65.NULL,
+      NUMBER = $__65.NUMBER,
+      OPEN_ANGLE = $__65.OPEN_ANGLE,
+      OPEN_CURLY = $__65.OPEN_CURLY,
+      OPEN_PAREN = $__65.OPEN_PAREN,
+      OPEN_SQUARE = $__65.OPEN_SQUARE,
+      OR = $__65.OR,
+      PACKAGE = $__65.PACKAGE,
+      PERCENT = $__65.PERCENT,
+      PERCENT_EQUAL = $__65.PERCENT_EQUAL,
+      PERIOD = $__65.PERIOD,
+      PLUS = $__65.PLUS,
+      PLUS_EQUAL = $__65.PLUS_EQUAL,
+      PLUS_PLUS = $__65.PLUS_PLUS,
+      PRIVATE = $__65.PRIVATE,
+      PROTECTED = $__65.PROTECTED,
+      PUBLIC = $__65.PUBLIC,
+      QUESTION = $__65.QUESTION,
+      REGULAR_EXPRESSION = $__65.REGULAR_EXPRESSION,
+      RETURN = $__65.RETURN,
+      RIGHT_SHIFT = $__65.RIGHT_SHIFT,
+      RIGHT_SHIFT_EQUAL = $__65.RIGHT_SHIFT_EQUAL,
+      SEMI_COLON = $__65.SEMI_COLON,
+      SLASH = $__65.SLASH,
+      SLASH_EQUAL = $__65.SLASH_EQUAL,
+      STAR = $__65.STAR,
+      STAR_EQUAL = $__65.STAR_EQUAL,
+      STATIC = $__65.STATIC,
+      STRING = $__65.STRING,
+      SUPER = $__65.SUPER,
+      SWITCH = $__65.SWITCH,
+      TEMPLATE_HEAD = $__65.TEMPLATE_HEAD,
+      TEMPLATE_MIDDLE = $__65.TEMPLATE_MIDDLE,
+      TEMPLATE_TAIL = $__65.TEMPLATE_TAIL,
+      THIS = $__65.THIS,
+      THROW = $__65.THROW,
+      TILDE = $__65.TILDE,
+      TRUE = $__65.TRUE,
+      TRY = $__65.TRY,
+      TYPEOF = $__65.TYPEOF,
+      UNSIGNED_RIGHT_SHIFT = $__65.UNSIGNED_RIGHT_SHIFT,
+      UNSIGNED_RIGHT_SHIFT_EQUAL = $__65.UNSIGNED_RIGHT_SHIFT_EQUAL,
+      VAR = $__65.VAR,
+      VOID = $__65.VOID,
+      WHILE = $__65.WHILE,
+      WITH = $__65.WITH,
+      YIELD = $__65.YIELD;
+  var $__65 = System.get("traceur@0.0.32/src/syntax/trees/ParseTrees"),
+      ArgumentList = $__65.ArgumentList,
+      ArrayComprehension = $__65.ArrayComprehension,
+      ArrayLiteralExpression = $__65.ArrayLiteralExpression,
+      ArrayPattern = $__65.ArrayPattern,
+      ArrowFunctionExpression = $__65.ArrowFunctionExpression,
+      AwaitStatement = $__65.AwaitStatement,
+      BinaryOperator = $__65.BinaryOperator,
+      BindingElement = $__65.BindingElement,
+      BindingIdentifier = $__65.BindingIdentifier,
+      Block = $__65.Block,
+      BreakStatement = $__65.BreakStatement,
+      CallExpression = $__65.CallExpression,
+      CaseClause = $__65.CaseClause,
+      Catch = $__65.Catch,
+      ClassDeclaration = $__65.ClassDeclaration,
+      ClassExpression = $__65.ClassExpression,
+      CommaExpression = $__65.CommaExpression,
+      ComprehensionFor = $__65.ComprehensionFor,
+      ComprehensionIf = $__65.ComprehensionIf,
+      ComputedPropertyName = $__65.ComputedPropertyName,
+      ConditionalExpression = $__65.ConditionalExpression,
+      ContinueStatement = $__65.ContinueStatement,
+      CoverFormals = $__65.CoverFormals,
+      CoverInitialisedName = $__65.CoverInitialisedName,
+      DebuggerStatement = $__65.DebuggerStatement,
+      Annotation = $__65.Annotation,
+      DefaultClause = $__65.DefaultClause,
+      DoWhileStatement = $__65.DoWhileStatement,
+      EmptyStatement = $__65.EmptyStatement,
+      ExportDeclaration = $__65.ExportDeclaration,
+      ExportDefault = $__65.ExportDefault,
+      ExportSpecifier = $__65.ExportSpecifier,
+      ExportSpecifierSet = $__65.ExportSpecifierSet,
+      ExportStar = $__65.ExportStar,
+      ExpressionStatement = $__65.ExpressionStatement,
+      Finally = $__65.Finally,
+      ForInStatement = $__65.ForInStatement,
+      ForOfStatement = $__65.ForOfStatement,
+      ForStatement = $__65.ForStatement,
+      FormalParameter = $__65.FormalParameter,
+      FormalParameterList = $__65.FormalParameterList,
+      FunctionBody = $__65.FunctionBody,
+      FunctionDeclaration = $__65.FunctionDeclaration,
+      FunctionExpression = $__65.FunctionExpression,
+      GeneratorComprehension = $__65.GeneratorComprehension,
+      GetAccessor = $__65.GetAccessor,
+      IdentifierExpression = $__65.IdentifierExpression,
+      IfStatement = $__65.IfStatement,
+      ImportDeclaration = $__65.ImportDeclaration,
+      ImportSpecifier = $__65.ImportSpecifier,
+      ImportSpecifierSet = $__65.ImportSpecifierSet,
+      ImportedBinding = $__65.ImportedBinding,
+      LabelledStatement = $__65.LabelledStatement,
+      LiteralExpression = $__65.LiteralExpression,
+      LiteralPropertyName = $__65.LiteralPropertyName,
+      MemberExpression = $__65.MemberExpression,
+      MemberLookupExpression = $__65.MemberLookupExpression,
+      Module = $__65.Module,
+      ModuleDeclaration = $__65.ModuleDeclaration,
+      ModuleSpecifier = $__65.ModuleSpecifier,
+      NamedExport = $__65.NamedExport,
+      NewExpression = $__65.NewExpression,
+      ObjectLiteralExpression = $__65.ObjectLiteralExpression,
+      ObjectPattern = $__65.ObjectPattern,
+      ObjectPatternField = $__65.ObjectPatternField,
+      ParenExpression = $__65.ParenExpression,
+      PostfixExpression = $__65.PostfixExpression,
+      PredefinedType = $__65.PredefinedType,
+      Script = $__65.Script,
+      PropertyMethodAssignment = $__65.PropertyMethodAssignment,
+      PropertyNameAssignment = $__65.PropertyNameAssignment,
+      PropertyNameShorthand = $__65.PropertyNameShorthand,
+      RestParameter = $__65.RestParameter,
+      ReturnStatement = $__65.ReturnStatement,
+      SetAccessor = $__65.SetAccessor,
+      SpreadExpression = $__65.SpreadExpression,
+      SpreadPatternElement = $__65.SpreadPatternElement,
+      SuperExpression = $__65.SuperExpression,
+      SwitchStatement = $__65.SwitchStatement,
+      SyntaxErrorTree = $__65.SyntaxErrorTree,
+      TemplateLiteralExpression = $__65.TemplateLiteralExpression,
+      TemplateLiteralPortion = $__65.TemplateLiteralPortion,
+      TemplateSubstitution = $__65.TemplateSubstitution,
+      ThisExpression = $__65.ThisExpression,
+      ThrowStatement = $__65.ThrowStatement,
+      TryStatement = $__65.TryStatement,
+      TypeName = $__65.TypeName,
+      UnaryExpression = $__65.UnaryExpression,
+      VariableDeclaration = $__65.VariableDeclaration,
+      VariableDeclarationList = $__65.VariableDeclarationList,
+      VariableStatement = $__65.VariableStatement,
+      WhileStatement = $__65.WhileStatement,
+      WithStatement = $__65.WithStatement,
+      YieldExpression = $__65.YieldExpression;
+  var Expression = {
+    NO_IN: 'NO_IN',
+    NORMAL: 'NORMAL'
+  };
+  var DestructuringInitialiser = {
+    REQUIRED: 'REQUIRED',
+    OPTIONAL: 'OPTIONAL'
+  };
+  var Initialiser = {
+    ALLOWED: 'ALLOWED',
+    REQUIRED: 'REQUIRED'
+  };
+  var Parser = function Parser(file) {
+    var errorReporter = arguments[1] !== (void 0) ? arguments[1] : new SyntaxErrorReporter();
+    this.errorReporter_ = errorReporter;
+    this.scanner_ = new Scanner(errorReporter, file, this);
+    this.allowYield_ = false;
+    this.strictMode_ = false;
+    this.coverInitialisedName_ = null;
+    this.annotations_ = [];
+  };
+  ($traceurRuntime.createClass)(Parser, {
+    parseScript: function() {
+      this.strictMode_ = false;
+      var start = this.getTreeStartLocation_();
+      var scriptItemList = this.parseScriptItemList_();
+      this.eat_(END_OF_FILE);
+      return new Script(this.getTreeLocation_(start), scriptItemList);
+    },
+    parseScriptItemList_: function() {
+      var result = [];
+      var type;
+      var checkUseStrictDirective = true;
+      while ((type = this.peekType_()) !== END_OF_FILE) {
+        var scriptItem = this.parseScriptItem_(type, false);
+        if (checkUseStrictDirective) {
+          if (!scriptItem.isDirectivePrologue()) {
+            checkUseStrictDirective = false;
+          } else if (scriptItem.isUseStrictDirective()) {
+            this.strictMode_ = true;
+            checkUseStrictDirective = false;
+          }
+        }
+        result.push(scriptItem);
+      }
+      return result;
+    },
+    parseScriptItem_: function(type, allowModuleItem) {
+      return this.parseStatement_(type, allowModuleItem, true);
+    },
+    parseModule: function() {
+      var start = this.getTreeStartLocation_();
+      var scriptItemList = this.parseModuleItemList_();
+      this.eat_(END_OF_FILE);
+      return new Module(this.getTreeLocation_(start), scriptItemList);
+    },
+    parseModuleItemList_: function() {
+      this.strictMode_ = true;
+      var result = [];
+      var type;
+      while ((type = this.peekType_()) !== END_OF_FILE) {
+        var scriptItem = this.parseScriptItem_(type, true);
+        result.push(scriptItem);
+      }
+      return result;
+    },
+    parseModuleSpecifier_: function() {
+      var start = this.getTreeStartLocation_();
+      var token = this.eat_(STRING);
+      return new ModuleSpecifier(this.getTreeLocation_(start), token);
+    },
+    parseImportDeclaration_: function() {
+      var start = this.getTreeStartLocation_();
+      this.eat_(IMPORT);
+      var importClause = null;
+      if (this.peekImportClause_(this.peekType_())) {
+        importClause = this.parseImportClause_();
+        this.eatId_(FROM);
+      }
+      var moduleSpecifier = this.parseModuleSpecifier_();
+      this.eatPossibleImplicitSemiColon_();
+      return new ImportDeclaration(this.getTreeLocation_(start), importClause, moduleSpecifier);
+    },
+    peekImportClause_: function(type) {
+      return type === OPEN_CURLY || this.peekBindingIdentifier_(type);
+    },
+    parseImportClause_: function() {
+      var start = this.getTreeStartLocation_();
+      if (this.eatIf_(OPEN_CURLY)) {
+        var specifiers = [];
+        while (!this.peek_(CLOSE_CURLY) && !this.isAtEnd()) {
+          specifiers.push(this.parseImportSpecifier_());
+          if (!this.eatIf_(COMMA))
+            break;
+        }
+        this.eat_(CLOSE_CURLY);
+        return new ImportSpecifierSet(this.getTreeLocation_(start), specifiers);
+      }
+      var binding = this.parseBindingIdentifier_();
+      return new ImportedBinding(this.getTreeLocation_(start), binding);
+    },
+    parseImportSpecifier_: function() {
+      var start = this.getTreeStartLocation_();
+      var token = this.peekToken_();
+      var isKeyword = token.isKeyword();
+      var lhs = this.eatIdName_();
+      var rhs = null;
+      if (isKeyword || this.peekPredefinedString_(AS)) {
+        this.eatId_(AS);
+        rhs = this.eatId_();
+      }
+      return new ImportSpecifier(this.getTreeLocation_(start), lhs, rhs);
+    },
+    parseExportDeclaration_: function() {
+      var start = this.getTreeStartLocation_();
+      this.eat_(EXPORT);
+      var exportTree;
+      var annotations = this.popAnnotations_();
+      var type = this.peekType_();
+      switch (type) {
+        case CONST:
+        case LET:
+        case VAR:
+          exportTree = this.parseVariableStatement_();
+          break;
+        case FUNCTION:
+          exportTree = this.parseFunctionDeclaration_();
+          break;
+        case CLASS:
+          exportTree = this.parseClassDeclaration_();
+          break;
+        case DEFAULT:
+          exportTree = this.parseExportDefault_();
+          break;
+        case OPEN_CURLY:
+        case STAR:
+          exportTree = this.parseNamedExport_();
+          break;
+        default:
+          return this.parseUnexpectedToken_(type);
+      }
+      return new ExportDeclaration(this.getTreeLocation_(start), exportTree, annotations);
+    },
+    parseExportDefault_: function() {
+      var start = this.getTreeStartLocation_();
+      this.eat_(DEFAULT);
+      var expression = this.parseAssignmentExpression();
+      this.eatPossibleImplicitSemiColon_();
+      return new ExportDefault(this.getTreeLocation_(start), expression);
+    },
+    parseNamedExport_: function() {
+      var start = this.getTreeStartLocation_();
+      var specifierSet,
+          expression;
+      if (this.peek_(OPEN_CURLY)) {
+        specifierSet = this.parseExportSpecifierSet_();
+        expression = this.parseFromModuleSpecifierOpt_(false);
+      } else {
+        this.eat_(STAR);
+        specifierSet = new ExportStar(this.getTreeLocation_(start));
+        expression = this.parseFromModuleSpecifierOpt_(true);
+      }
+      this.eatPossibleImplicitSemiColon_();
+      return new NamedExport(this.getTreeLocation_(start), expression, specifierSet);
+    },
+    parseFromModuleSpecifierOpt_: function(required) {
+      if (required || this.peekPredefinedString_(FROM)) {
+        this.eatId_(FROM);
+        return this.parseModuleSpecifier_();
+      }
+      return null;
+    },
+    parseExportSpecifierSet_: function() {
+      var start = this.getTreeStartLocation_();
+      this.eat_(OPEN_CURLY);
+      var specifiers = [this.parseExportSpecifier_()];
+      while (this.eatIf_(COMMA)) {
+        if (this.peek_(CLOSE_CURLY))
+          break;
+        specifiers.push(this.parseExportSpecifier_());
+      }
+      this.eat_(CLOSE_CURLY);
+      return new ExportSpecifierSet(this.getTreeLocation_(start), specifiers);
+    },
+    parseExportSpecifier_: function() {
+      var start = this.getTreeStartLocation_();
+      var lhs = this.eatId_();
+      var rhs = null;
+      if (this.peekPredefinedString_(AS)) {
+        this.eatId_(AS);
+        rhs = this.eatIdName_();
+      }
+      return new ExportSpecifier(this.getTreeLocation_(start), lhs, rhs);
+    },
+    peekId_: function(type) {
+      if (type === IDENTIFIER)
+        return true;
+      if (this.strictMode_)
+        return false;
+      return this.peekToken_().isStrictKeyword();
+    },
+    peekIdName_: function(token) {
+      return token.type === IDENTIFIER || token.isKeyword();
+    },
+    parseClassShared_: function(constr) {
+      var start = this.getTreeStartLocation_();
+      var strictMode = this.strictMode_;
+      this.strictMode_ = true;
+      this.eat_(CLASS);
+      var name = null;
+      var annotations = [];
+      if (constr == ClassDeclaration || !this.peek_(EXTENDS) && !this.peek_(OPEN_CURLY)) {
+        name = this.parseBindingIdentifier_();
+        annotations = this.popAnnotations_();
+      }
+      var superClass = null;
+      if (this.eatIf_(EXTENDS)) {
+        superClass = this.parseAssignmentExpression();
+      }
+      this.eat_(OPEN_CURLY);
+      var elements = this.parseClassElements_();
+      this.eat_(CLOSE_CURLY);
+      this.strictMode_ = strictMode;
+      return new constr(this.getTreeLocation_(start), name, superClass, elements, annotations);
+    },
+    parseClassDeclaration_: function() {
+      return this.parseClassShared_(ClassDeclaration);
+    },
+    parseClassExpression_: function() {
+      return this.parseClassShared_(ClassExpression);
+    },
+    parseClassElements_: function() {
+      var result = [];
+      while (true) {
+        var type = this.peekType_();
+        if (type === SEMI_COLON) {
+          this.nextToken_();
+        } else if (this.peekClassElement_(this.peekType_())) {
+          result.push(this.parseClassElement_());
+        } else {
+          break;
+        }
+      }
+      return result;
+    },
+    peekClassElement_: function(type) {
+      return this.peekPropertyName_(type) || type === STAR && parseOptions.generators || type === AT && parseOptions.annotations;
+    },
+    parsePropertyName_: function() {
+      if (this.peek_(OPEN_SQUARE))
+        return this.parseComputedPropertyName_();
+      return this.parseLiteralPropertyName_();
+    },
+    parseLiteralPropertyName_: function() {
+      var start = this.getTreeStartLocation_();
+      var token = this.nextToken_();
+      return new LiteralPropertyName(this.getTreeLocation_(start), token);
+    },
+    parseComputedPropertyName_: function() {
+      var start = this.getTreeStartLocation_();
+      this.eat_(OPEN_SQUARE);
+      var expression = this.parseAssignmentExpression();
+      this.eat_(CLOSE_SQUARE);
+      return new ComputedPropertyName(this.getTreeLocation_(start), expression);
+    },
+    parseStatement: function() {
+      return this.parseStatement_(this.peekType_(), false, false);
+    },
+    parseStatement_: function(type, allowModuleItem, allowScriptItem) {
+      switch (type) {
+        case RETURN:
+          return this.parseReturnStatement_();
+        case CONST:
+        case LET:
+          if (!parseOptions.blockBinding)
+            break;
+        case VAR:
+          return this.parseVariableStatement_();
+        case IF:
+          return this.parseIfStatement_();
+        case FOR:
+          return this.parseForStatement_();
+        case BREAK:
+          return this.parseBreakStatement_();
+        case SWITCH:
+          return this.parseSwitchStatement_();
+        case THROW:
+          return this.parseThrowStatement_();
+        case WHILE:
+          return this.parseWhileStatement_();
+        case FUNCTION:
+          return this.parseFunctionDeclaration_();
+        case AT:
+          if (parseOptions.annotations)
+            return this.parseAnnotatedDeclarations_(allowModuleItem, allowScriptItem);
+          break;
+        case AWAIT:
+          if (parseOptions.deferredFunctions)
+            return this.parseAwaitStatement_();
+          break;
+        case CLASS:
+          if (parseOptions.classes)
+            return this.parseClassDeclaration_();
+          break;
+        case CONTINUE:
+          return this.parseContinueStatement_();
+        case DEBUGGER:
+          return this.parseDebuggerStatement_();
+        case DO:
+          return this.parseDoWhileStatement_();
+        case EXPORT:
+          if (allowModuleItem && parseOptions.modules)
+            return this.parseExportDeclaration_();
+          break;
+        case IMPORT:
+          if (allowScriptItem && parseOptions.modules)
+            return this.parseImportDeclaration_();
+          break;
+        case OPEN_CURLY:
+          return this.parseBlock_();
+        case SEMI_COLON:
+          return this.parseEmptyStatement_();
+        case TRY:
+          return this.parseTryStatement_();
+        case WITH:
+          return this.parseWithStatement_();
+      }
+      return this.parseFallThroughStatement_(allowScriptItem);
+    },
+    parseFunctionDeclaration_: function() {
+      return this.parseFunction_(FunctionDeclaration);
+    },
+    parseFunctionExpression_: function() {
+      return this.parseFunction_(FunctionExpression);
+    },
+    parseFunction_: function(ctor) {
+      var start = this.getTreeStartLocation_();
+      this.eat_(FUNCTION);
+      var isGenerator = parseOptions.generators && this.eatIf_(STAR);
+      var name = null;
+      var annotations = [];
+      if (ctor === FunctionDeclaration || this.peekBindingIdentifier_(this.peekType_())) {
+        name = this.parseBindingIdentifier_();
+        annotations = this.popAnnotations_();
+      }
+      this.eat_(OPEN_PAREN);
+      var formalParameterList = this.parseFormalParameterList_();
+      this.eat_(CLOSE_PAREN);
+      var typeAnnotation = this.parseTypeAnnotationOpt_();
+      var functionBody = this.parseFunctionBody_(isGenerator, formalParameterList);
+      return new ctor(this.getTreeLocation_(start), name, isGenerator, formalParameterList, typeAnnotation, annotations, functionBody);
+    },
+    peekRest_: function(type) {
+      return type === DOT_DOT_DOT && parseOptions.restParameters;
+    },
+    parseFormalParameterList_: function() {
+      var start = this.getTreeStartLocation_();
+      var formals = [];
+      this.pushAnnotations_();
+      var type = this.peekType_();
+      if (this.peekRest_(type)) {
+        formals.push(this.parseFormalRestParameter_());
+      } else {
+        if (this.peekFormalParameter_(this.peekType_()))
+          formals.push(this.parseFormalParameter_());
+        while (this.eatIf_(COMMA)) {
+          this.pushAnnotations_();
+          if (this.peekRest_(this.peekType_())) {
+            formals.push(this.parseFormalRestParameter_());
+            break;
+          }
+          formals.push(this.parseFormalParameter_());
+        }
+      }
+      return new FormalParameterList(this.getTreeLocation_(start), formals);
+    },
+    peekFormalParameter_: function(type) {
+      return this.peekBindingElement_(type);
+    },
+    parseFormalParameter_: function() {
+      var initialiserAllowed = arguments[0];
+      var start = this.getTreeStartLocation_();
+      var binding = this.parseBindingElementBinding_();
+      var typeAnnotation = this.parseTypeAnnotationOpt_();
+      var initialiser = this.parseBindingElementInitialiser_(initialiserAllowed);
+      return new FormalParameter(this.getTreeLocation_(start), new BindingElement(this.getTreeLocation_(start), binding, initialiser), typeAnnotation, this.popAnnotations_());
+    },
+    parseFormalRestParameter_: function() {
+      var start = this.getTreeStartLocation_();
+      var restParameter = this.parseRestParameter_();
+      var typeAnnotation = this.parseTypeAnnotationOpt_();
+      return new FormalParameter(this.getTreeLocation_(start), restParameter, typeAnnotation, this.popAnnotations_());
+    },
+    parseRestParameter_: function() {
+      var start = this.getTreeStartLocation_();
+      this.eat_(DOT_DOT_DOT);
+      var id = this.parseBindingIdentifier_();
+      return new RestParameter(this.getTreeLocation_(start), id);
+    },
+    parseFunctionBody_: function(isGenerator, params) {
+      var start = this.getTreeStartLocation_();
+      this.eat_(OPEN_CURLY);
+      var allowYield = this.allowYield_;
+      var strictMode = this.strictMode_;
+      this.allowYield_ = isGenerator;
+      var result = this.parseStatementList_(!strictMode);
+      if (!strictMode && this.strictMode_ && params)
+        StrictParams.visit(params, this.errorReporter_);
+      this.strictMode_ = strictMode;
+      this.allowYield_ = allowYield;
+      this.eat_(CLOSE_CURLY);
+      return new FunctionBody(this.getTreeLocation_(start), result);
+    },
+    parseStatements: function() {
+      return this.parseStatementList_(false);
+    },
+    parseStatementList_: function(checkUseStrictDirective) {
+      var result = [];
+      var type;
+      while ((type = this.peekType_()) !== CLOSE_CURLY && type !== END_OF_FILE) {
+        var statement = this.parseStatement_(type, false, false);
+        if (checkUseStrictDirective) {
+          if (!statement.isDirectivePrologue()) {
+            checkUseStrictDirective = false;
+          } else if (statement.isUseStrictDirective()) {
+            this.strictMode_ = true;
+            checkUseStrictDirective = false;
+          }
+        }
+        result.push(statement);
+      }
+      return result;
+    },
+    parseSpreadExpression_: function() {
+      if (!parseOptions.spread)
+        return this.parseUnexpectedToken_(DOT_DOT_DOT);
+      var start = this.getTreeStartLocation_();
+      this.eat_(DOT_DOT_DOT);
+      var operand = this.parseAssignmentExpression();
+      return new SpreadExpression(this.getTreeLocation_(start), operand);
+    },
+    parseBlock_: function() {
+      var start = this.getTreeStartLocation_();
+      this.eat_(OPEN_CURLY);
+      var result = this.parseStatementList_(false);
+      this.eat_(CLOSE_CURLY);
+      return new Block(this.getTreeLocation_(start), result);
+    },
+    parseVariableStatement_: function() {
+      var start = this.getTreeStartLocation_();
+      var declarations = this.parseVariableDeclarationList_();
+      this.checkInitialisers_(declarations);
+      this.eatPossibleImplicitSemiColon_();
+      return new VariableStatement(this.getTreeLocation_(start), declarations);
+    },
+    parseVariableDeclarationList_: function() {
+      var expressionIn = arguments[0] !== (void 0) ? arguments[0] : Expression.NORMAL;
+      var initialiser = arguments[1] !== (void 0) ? arguments[1] : DestructuringInitialiser.REQUIRED;
+      var type = this.peekType_();
+      switch (type) {
+        case CONST:
+        case LET:
+          if (!parseOptions.blockBinding)
+            debugger;
+        case VAR:
+          this.nextToken_();
+          break;
+        default:
+          throw Error('unreachable');
+      }
+      var start = this.getTreeStartLocation_();
+      var declarations = [];
+      declarations.push(this.parseVariableDeclaration_(type, expressionIn, initialiser));
+      while (this.eatIf_(COMMA)) {
+        declarations.push(this.parseVariableDeclaration_(type, expressionIn, initialiser));
+      }
+      return new VariableDeclarationList(this.getTreeLocation_(start), type, declarations);
+    },
+    parseVariableDeclaration_: function(binding, expressionIn) {
+      var initialiser = arguments[2] !== (void 0) ? arguments[2] : DestructuringInitialiser.REQUIRED;
+      var initRequired = initialiser !== DestructuringInitialiser.OPTIONAL;
+      var start = this.getTreeStartLocation_();
+      var lvalue;
+      var typeAnnotation;
+      if (this.peekPattern_(this.peekType_())) {
+        lvalue = this.parseBindingPattern_();
+        typeAnnotation = null;
+      } else {
+        lvalue = this.parseBindingIdentifier_();
+        typeAnnotation = this.parseTypeAnnotationOpt_();
+      }
+      var initialiser = null;
+      if (this.peek_(EQUAL))
+        initialiser = this.parseInitialiser_(expressionIn);
+      else if (lvalue.isPattern() && initRequired)
+        this.reportError_('destructuring must have an initialiser');
+      return new VariableDeclaration(this.getTreeLocation_(start), lvalue, typeAnnotation, initialiser);
+    },
+    parseInitialiser_: function(expressionIn) {
+      this.eat_(EQUAL);
+      return this.parseAssignmentExpression(expressionIn);
+    },
+    parseEmptyStatement_: function() {
+      var start = this.getTreeStartLocation_();
+      this.eat_(SEMI_COLON);
+      return new EmptyStatement(this.getTreeLocation_(start));
+    },
+    parseFallThroughStatement_: function(allowScriptItem) {
+      var start = this.getTreeStartLocation_();
+      var expression = this.parseExpression();
+      if (expression.type === IDENTIFIER_EXPRESSION) {
+        var nameToken = expression.identifierToken;
+        if (this.eatIf_(COLON)) {
+          var statement = this.parseStatement();
+          return new LabelledStatement(this.getTreeLocation_(start), nameToken, statement);
+        }
+        if (allowScriptItem && nameToken.value === MODULE && parseOptions.modules) {
+          var token = this.peekTokenNoLineTerminator_();
+          if (token !== null && token.type === IDENTIFIER) {
+            var name = this.eatId_();
+            this.eatId_(FROM);
+            var moduleSpecifier = this.parseModuleSpecifier_();
+            this.eatPossibleImplicitSemiColon_();
+            return new ModuleDeclaration(this.getTreeLocation_(start), name, moduleSpecifier);
+          }
+        }
+      }
+      this.eatPossibleImplicitSemiColon_();
+      return new ExpressionStatement(this.getTreeLocation_(start), expression);
+    },
+    parseIfStatement_: function() {
+      var start = this.getTreeStartLocation_();
+      this.eat_(IF);
+      this.eat_(OPEN_PAREN);
+      var condition = this.parseExpression();
+      this.eat_(CLOSE_PAREN);
+      var ifClause = this.parseStatement();
+      var elseClause = null;
+      if (this.eatIf_(ELSE)) {
+        elseClause = this.parseStatement();
+      }
+      return new IfStatement(this.getTreeLocation_(start), condition, ifClause, elseClause);
+    },
+    parseDoWhileStatement_: function() {
+      var start = this.getTreeStartLocation_();
+      this.eat_(DO);
+      var body = this.parseStatement();
+      this.eat_(WHILE);
+      this.eat_(OPEN_PAREN);
+      var condition = this.parseExpression();
+      this.eat_(CLOSE_PAREN);
+      this.eatPossibleImplicitSemiColon_();
+      return new DoWhileStatement(this.getTreeLocation_(start), body, condition);
+    },
+    parseWhileStatement_: function() {
+      var start = this.getTreeStartLocation_();
+      this.eat_(WHILE);
+      this.eat_(OPEN_PAREN);
+      var condition = this.parseExpression();
+      this.eat_(CLOSE_PAREN);
+      var body = this.parseStatement();
+      return new WhileStatement(this.getTreeLocation_(start), condition, body);
+    },
+    parseForStatement_: function() {
+      var $__62 = this;
+      var start = this.getTreeStartLocation_();
+      this.eat_(FOR);
+      this.eat_(OPEN_PAREN);
+      var validate = (function(variables, kind) {
+        if (variables.declarations.length > 1) {
+          $__62.reportError_(kind + ' statement may not have more than one variable declaration');
+        }
+        var declaration = variables.declarations[0];
+        if (declaration.lvalue.isPattern() && declaration.initialiser) {
+          $__62.reportError_(declaration.initialiser.location, ("initialiser is not allowed in " + kind + " loop with pattern"));
+        }
+      });
+      var type = this.peekType_();
+      if (this.peekVariableDeclarationList_(type)) {
+        var variables = this.parseVariableDeclarationList_(Expression.NO_IN, DestructuringInitialiser.OPTIONAL);
+        type = this.peekType_();
+        if (type === IN) {
+          validate(variables, 'for-in');
+          var declaration = variables.declarations[0];
+          if (parseOptions.blockBinding && (variables.declarationType == LET || variables.declarationType == CONST)) {
+            if (declaration.initialiser != null) {
+              this.reportError_('let/const in for-in statement may not have initialiser');
+            }
+          }
+          return this.parseForInStatement_(start, variables);
+        } else if (this.peekOf_(type)) {
+          validate(variables, 'for-of');
+          var declaration = variables.declarations[0];
+          if (declaration.initialiser != null) {
+            this.reportError_('for-of statement may not have initialiser');
+          }
+          return this.parseForOfStatement_(start, variables);
+        } else {
+          this.checkInitialisers_(variables);
+          return this.parseForStatement2_(start, variables);
+        }
+      }
+      if (type === SEMI_COLON) {
+        return this.parseForStatement2_(start, null);
+      }
+      var initialiser = this.parseExpression(Expression.NO_IN);
+      type = this.peekType_();
+      if (initialiser.isLeftHandSideExpression() && (type === IN || this.peekOf_(type))) {
+        initialiser = this.transformLeftHandSideExpression_(initialiser);
+        if (this.peekOf_(type))
+          return this.parseForOfStatement_(start, initialiser);
+        return this.parseForInStatement_(start, initialiser);
+      }
+      return this.parseForStatement2_(start, initialiser);
+    },
+    peekOf_: function(type) {
+      return type === IDENTIFIER && parseOptions.forOf && this.peekToken_().value === OF;
+    },
+    parseForOfStatement_: function(start, initialiser) {
+      this.eatId_();
+      var collection = this.parseExpression();
+      this.eat_(CLOSE_PAREN);
+      var body = this.parseStatement();
+      return new ForOfStatement(this.getTreeLocation_(start), initialiser, collection, body);
+    },
+    checkInitialisers_: function(variables) {
+      if (parseOptions.blockBinding && variables.declarationType == CONST) {
+        var type = variables.declarationType;
+        for (var i = 0; i < variables.declarations.length; i++) {
+          if (!this.checkInitialiser_(type, variables.declarations[i])) {
+            break;
+          }
+        }
+      }
+    },
+    checkInitialiser_: function(type, declaration) {
+      if (parseOptions.blockBinding && type == CONST && declaration.initialiser == null) {
+        this.reportError_('const variables must have an initialiser');
+        return false;
+      }
+      return true;
+    },
+    peekVariableDeclarationList_: function(type) {
+      switch (type) {
+        case VAR:
+          return true;
+        case CONST:
+        case LET:
+          return parseOptions.blockBinding;
+        default:
+          return false;
+      }
+    },
+    parseForStatement2_: function(start, initialiser) {
+      this.eat_(SEMI_COLON);
+      var condition = null;
+      if (!this.peek_(SEMI_COLON)) {
+        condition = this.parseExpression();
+      }
+      this.eat_(SEMI_COLON);
+      var increment = null;
+      if (!this.peek_(CLOSE_PAREN)) {
+        increment = this.parseExpression();
+      }
+      this.eat_(CLOSE_PAREN);
+      var body = this.parseStatement();
+      return new ForStatement(this.getTreeLocation_(start), initialiser, condition, increment, body);
+    },
+    parseForInStatement_: function(start, initialiser) {
+      this.eat_(IN);
+      var collection = this.parseExpression();
+      this.eat_(CLOSE_PAREN);
+      var body = this.parseStatement();
+      return new ForInStatement(this.getTreeLocation_(start), initialiser, collection, body);
+    },
+    parseContinueStatement_: function() {
+      var start = this.getTreeStartLocation_();
+      this.eat_(CONTINUE);
+      var name = null;
+      if (!this.peekImplicitSemiColon_(this.peekType_())) {
+        name = this.eatIdOpt_();
+      }
+      this.eatPossibleImplicitSemiColon_();
+      return new ContinueStatement(this.getTreeLocation_(start), name);
+    },
+    parseBreakStatement_: function() {
+      var start = this.getTreeStartLocation_();
+      this.eat_(BREAK);
+      var name = null;
+      if (!this.peekImplicitSemiColon_(this.peekType_())) {
+        name = this.eatIdOpt_();
+      }
+      this.eatPossibleImplicitSemiColon_();
+      return new BreakStatement(this.getTreeLocation_(start), name);
+    },
+    parseReturnStatement_: function() {
+      var start = this.getTreeStartLocation_();
+      this.eat_(RETURN);
+      var expression = null;
+      if (!this.peekImplicitSemiColon_(this.peekType_())) {
+        expression = this.parseExpression();
+      }
+      this.eatPossibleImplicitSemiColon_();
+      return new ReturnStatement(this.getTreeLocation_(start), expression);
+    },
+    parseYieldExpression_: function() {
+      var start = this.getTreeStartLocation_();
+      this.eat_(YIELD);
+      var expression = null;
+      var isYieldFor = false;
+      if (!this.peekImplicitSemiColon_(this.peekType_())) {
+        isYieldFor = this.eatIf_(STAR);
+        expression = this.parseAssignmentExpression();
+      }
+      return new YieldExpression(this.getTreeLocation_(start), expression, isYieldFor);
+    },
+    parseAwaitStatement_: function() {
+      var start = this.getTreeStartLocation_();
+      this.eat_(AWAIT);
+      var identifier = null;
+      if (this.peek_(IDENTIFIER) && this.peek_(EQUAL, 1)) {
+        identifier = this.eatId_();
+        this.eat_(EQUAL);
+      }
+      var expression = this.parseExpression();
+      this.eatPossibleImplicitSemiColon_();
+      return new AwaitStatement(this.getTreeLocation_(start), identifier, expression);
+    },
+    parseWithStatement_: function() {
+      if (this.strictMode_)
+        this.reportError_('Strict mode code may not include a with statement');
+      var start = this.getTreeStartLocation_();
+      this.eat_(WITH);
+      this.eat_(OPEN_PAREN);
+      var expression = this.parseExpression();
+      this.eat_(CLOSE_PAREN);
+      var body = this.parseStatement();
+      return new WithStatement(this.getTreeLocation_(start), expression, body);
+    },
+    parseSwitchStatement_: function() {
+      var start = this.getTreeStartLocation_();
+      this.eat_(SWITCH);
+      this.eat_(OPEN_PAREN);
+      var expression = this.parseExpression();
+      this.eat_(CLOSE_PAREN);
+      this.eat_(OPEN_CURLY);
+      var caseClauses = this.parseCaseClauses_();
+      this.eat_(CLOSE_CURLY);
+      return new SwitchStatement(this.getTreeLocation_(start), expression, caseClauses);
+    },
+    parseCaseClauses_: function() {
+      var foundDefaultClause = false;
+      var result = [];
+      while (true) {
+        var start = this.getTreeStartLocation_();
+        switch (this.peekType_()) {
+          case CASE:
+            this.nextToken_();
+            var expression = this.parseExpression();
+            this.eat_(COLON);
+            var statements = this.parseCaseStatementsOpt_();
+            result.push(new CaseClause(this.getTreeLocation_(start), expression, statements));
+            break;
+          case DEFAULT:
+            if (foundDefaultClause) {
+              this.reportError_('Switch statements may have at most one default clause');
+            } else {
+              foundDefaultClause = true;
+            }
+            this.nextToken_();
+            this.eat_(COLON);
+            result.push(new DefaultClause(this.getTreeLocation_(start), this.parseCaseStatementsOpt_()));
+            break;
+          default:
+            return result;
+        }
+      }
+    },
+    parseCaseStatementsOpt_: function() {
+      var result = [];
+      var type;
+      while (true) {
+        switch (type = this.peekType_()) {
+          case CASE:
+          case DEFAULT:
+          case CLOSE_CURLY:
+          case END_OF_FILE:
+            return result;
+        }
+        result.push(this.parseStatement_(type, false, false));
+      }
+    },
+    parseThrowStatement_: function() {
+      var start = this.getTreeStartLocation_();
+      this.eat_(THROW);
+      var value = null;
+      if (!this.peekImplicitSemiColon_(this.peekType_())) {
+        value = this.parseExpression();
+      }
+      this.eatPossibleImplicitSemiColon_();
+      return new ThrowStatement(this.getTreeLocation_(start), value);
+    },
+    parseTryStatement_: function() {
+      var start = this.getTreeStartLocation_();
+      this.eat_(TRY);
+      var body = this.parseBlock_();
+      var catchBlock = null;
+      if (this.peek_(CATCH)) {
+        catchBlock = this.parseCatch_();
+      }
+      var finallyBlock = null;
+      if (this.peek_(FINALLY)) {
+        finallyBlock = this.parseFinallyBlock_();
+      }
+      if (catchBlock == null && finallyBlock == null) {
+        this.reportError_("'catch' or 'finally' expected.");
+      }
+      return new TryStatement(this.getTreeLocation_(start), body, catchBlock, finallyBlock);
+    },
+    parseCatch_: function() {
+      var start = this.getTreeStartLocation_();
+      var catchBlock;
+      this.eat_(CATCH);
+      this.eat_(OPEN_PAREN);
+      var binding;
+      if (this.peekPattern_(this.peekType_()))
+        binding = this.parseBindingPattern_();
+      else
+        binding = this.parseBindingIdentifier_();
+      this.eat_(CLOSE_PAREN);
+      var catchBody = this.parseBlock_();
+      catchBlock = new Catch(this.getTreeLocation_(start), binding, catchBody);
+      return catchBlock;
+    },
+    parseFinallyBlock_: function() {
+      var start = this.getTreeStartLocation_();
+      this.eat_(FINALLY);
+      var finallyBlock = this.parseBlock_();
+      return new Finally(this.getTreeLocation_(start), finallyBlock);
+    },
+    parseDebuggerStatement_: function() {
+      var start = this.getTreeStartLocation_();
+      this.eat_(DEBUGGER);
+      this.eatPossibleImplicitSemiColon_();
+      return new DebuggerStatement(this.getTreeLocation_(start));
+    },
+    parsePrimaryExpression_: function() {
+      switch (this.peekType_()) {
+        case CLASS:
+          return parseOptions.classes ? this.parseClassExpression_() : this.parseSyntaxError_('Unexpected reserved word');
+        case THIS:
+          return this.parseThisExpression_();
+        case IDENTIFIER:
+          return this.parseIdentifierExpression_();
+        case NUMBER:
+        case STRING:
+        case TRUE:
+        case FALSE:
+        case NULL:
+          return this.parseLiteralExpression_();
+        case OPEN_SQUARE:
+          return this.parseArrayLiteral_();
+        case OPEN_CURLY:
+          return this.parseObjectLiteral_();
+        case OPEN_PAREN:
+          return this.parsePrimaryExpressionStartingWithParen_();
+        case SLASH:
+        case SLASH_EQUAL:
+          return this.parseRegularExpressionLiteral_();
+        case NO_SUBSTITUTION_TEMPLATE:
+        case TEMPLATE_HEAD:
+          return this.parseTemplateLiteral_(null);
+        case IMPLEMENTS:
+        case INTERFACE:
+        case PACKAGE:
+        case PRIVATE:
+        case PROTECTED:
+        case PUBLIC:
+        case STATIC:
+        case YIELD:
+          if (!this.strictMode_)
+            return this.parseIdentifierExpression_();
+          this.reportReservedIdentifier_(this.nextToken_());
+        case END_OF_FILE:
+          return this.parseSyntaxError_('Unexpected end of input');
+        default:
+          return this.parseUnexpectedToken_(this.peekToken_());
+      }
+    },
+    parseSuperExpression_: function() {
+      var start = this.getTreeStartLocation_();
+      this.eat_(SUPER);
+      return new SuperExpression(this.getTreeLocation_(start));
+    },
+    parseThisExpression_: function() {
+      var start = this.getTreeStartLocation_();
+      this.eat_(THIS);
+      return new ThisExpression(this.getTreeLocation_(start));
+    },
+    peekBindingIdentifier_: function(type) {
+      return this.peekId_(type);
+    },
+    parseBindingIdentifier_: function() {
+      var start = this.getTreeStartLocation_();
+      var identifier = this.eatId_();
+      return new BindingIdentifier(this.getTreeLocation_(start), identifier);
+    },
+    parseIdentifierExpression_: function() {
+      var start = this.getTreeStartLocation_();
+      var identifier = this.eatId_();
+      return new IdentifierExpression(this.getTreeLocation_(start), identifier);
+    },
+    parseIdentifierNameExpression_: function() {
+      var start = this.getTreeStartLocation_();
+      var identifier = this.eatIdName_();
+      return new IdentifierExpression(this.getTreeLocation_(start), identifier);
+    },
+    parseLiteralExpression_: function() {
+      var start = this.getTreeStartLocation_();
+      var literal = this.nextLiteralToken_();
+      return new LiteralExpression(this.getTreeLocation_(start), literal);
+    },
+    nextLiteralToken_: function() {
+      return this.nextToken_();
+    },
+    parseRegularExpressionLiteral_: function() {
+      var start = this.getTreeStartLocation_();
+      var literal = this.nextRegularExpressionLiteralToken_();
+      return new LiteralExpression(this.getTreeLocation_(start), literal);
+    },
+    peekSpread_: function(type) {
+      return type === DOT_DOT_DOT && parseOptions.spread;
+    },
+    parseArrayLiteral_: function() {
+      var start = this.getTreeStartLocation_();
+      var expression;
+      var elements = [];
+      this.eat_(OPEN_SQUARE);
+      var type = this.peekType_();
+      if (type === FOR && parseOptions.arrayComprehension)
+        return this.parseArrayComprehension_(start);
+      while (true) {
+        type = this.peekType_();
+        if (type === COMMA) {
+          expression = null;
+        } else if (this.peekSpread_(type)) {
+          expression = this.parseSpreadExpression_();
+        } else if (this.peekAssignmentExpression_(type)) {
+          expression = this.parseAssignmentExpression();
+        } else {
+          break;
+        }
+        elements.push(expression);
+        type = this.peekType_();
+        if (type !== CLOSE_SQUARE)
+          this.eat_(COMMA);
+      }
+      this.eat_(CLOSE_SQUARE);
+      return new ArrayLiteralExpression(this.getTreeLocation_(start), elements);
+    },
+    parseArrayComprehension_: function(start) {
+      var list = this.parseComprehensionList_();
+      var expression = this.parseAssignmentExpression();
+      this.eat_(CLOSE_SQUARE);
+      return new ArrayComprehension(this.getTreeLocation_(start), list, expression);
+    },
+    parseComprehensionList_: function() {
+      var list = [this.parseComprehensionFor_()];
+      while (true) {
+        var type = this.peekType_();
+        switch (type) {
+          case FOR:
+            list.push(this.parseComprehensionFor_());
+            break;
+          case IF:
+            list.push(this.parseComprehensionIf_());
+            break;
+          default:
+            return list;
+        }
+      }
+    },
+    parseComprehensionFor_: function() {
+      var start = this.getTreeStartLocation_();
+      this.eat_(FOR);
+      this.eat_(OPEN_PAREN);
+      var left = this.parseForBinding_();
+      this.eatId_(OF);
+      var iterator = this.parseExpression();
+      this.eat_(CLOSE_PAREN);
+      return new ComprehensionFor(this.getTreeLocation_(start), left, iterator);
+    },
+    parseComprehensionIf_: function() {
+      var start = this.getTreeStartLocation_();
+      this.eat_(IF);
+      this.eat_(OPEN_PAREN);
+      var expression = this.parseExpression();
+      this.eat_(CLOSE_PAREN);
+      return new ComprehensionIf(this.getTreeLocation_(start), expression);
+    },
+    parseObjectLiteral_: function() {
+      var start = this.getTreeStartLocation_();
+      var result = [];
+      this.eat_(OPEN_CURLY);
+      while (this.peekPropertyDefinition_(this.peekType_())) {
+        var propertyDefinition = this.parsePropertyDefinition();
+        result.push(propertyDefinition);
+        if (!this.eatIf_(COMMA))
+          break;
+      }
+      this.eat_(CLOSE_CURLY);
+      return new ObjectLiteralExpression(this.getTreeLocation_(start), result);
+    },
+    parsePropertyDefinition: function() {
+      var start = this.getTreeStartLocation_();
+      var isGenerator = false;
+      var isStatic = false;
+      if (parseOptions.generators && parseOptions.propertyMethods && this.peek_(STAR)) {
+        return this.parseGeneratorMethod_(start, isStatic, []);
+      }
+      var token = this.peekToken_();
+      var name = this.parsePropertyName_();
+      if (parseOptions.propertyMethods && this.peek_(OPEN_PAREN))
+        return this.parseMethod_(start, isStatic, isGenerator, name, []);
+      if (this.eatIf_(COLON)) {
+        var value = this.parseAssignmentExpression();
+        return new PropertyNameAssignment(this.getTreeLocation_(start), name, value);
+      }
+      var type = this.peekType_();
+      if (name.type === LITERAL_PROPERTY_NAME) {
+        var nameLiteral = name.literalToken;
+        if (nameLiteral.value === GET && this.peekPropertyName_(type)) {
+          return this.parseGetAccessor_(start, isStatic, []);
+        }
+        if (nameLiteral.value === SET && this.peekPropertyName_(type)) {
+          return this.parseSetAccessor_(start, isStatic, []);
+        }
+        if (parseOptions.propertyNameShorthand && nameLiteral.type === IDENTIFIER || !this.strictMode_ && nameLiteral.type === YIELD) {
+          if (this.peek_(EQUAL)) {
+            token = this.nextToken_();
+            var expr = this.parseAssignmentExpression();
+            return this.coverInitialisedName_ = new CoverInitialisedName(this.getTreeLocation_(start), nameLiteral, token, expr);
+          }
+          if (nameLiteral.type === YIELD)
+            nameLiteral = new IdentifierToken(nameLiteral.location, YIELD);
+          return new PropertyNameShorthand(this.getTreeLocation_(start), nameLiteral);
+        }
+        if (this.strictMode_ && nameLiteral.isStrictKeyword())
+          this.reportReservedIdentifier_(nameLiteral);
+      }
+      if (name.type === COMPUTED_PROPERTY_NAME)
+        token = this.peekToken_();
+      return this.parseUnexpectedToken_(token);
+    },
+    parseClassElement_: function() {
+      var start = this.getTreeStartLocation_();
+      var annotations = this.parseAnnotations_();
+      var type = this.peekType_();
+      var isStatic = false,
+          isGenerator = false;
+      switch (type) {
+        case STATIC:
+          var staticToken = this.nextToken_();
+          type = this.peekType_();
+          switch (type) {
+            case OPEN_PAREN:
+              var name = new LiteralPropertyName(start, staticToken);
+              return this.parseMethod_(start, isStatic, isGenerator, name, annotations);
+            default:
+              isStatic = true;
+              if (type === STAR && parseOptions.generators)
+                return this.parseGeneratorMethod_(start, true, annotations);
+              return this.parseGetSetOrMethod_(start, isStatic, annotations);
+          }
+          break;
+        case STAR:
+          return this.parseGeneratorMethod_(start, isStatic, annotations);
+        default:
+          return this.parseGetSetOrMethod_(start, isStatic, annotations);
+      }
+    },
+    parseGeneratorMethod_: function(start, isStatic, annotations) {
+      var isGenerator = true;
+      this.eat_(STAR);
+      var name = this.parsePropertyName_();
+      return this.parseMethod_(start, isStatic, isGenerator, name, annotations);
+    },
+    parseMethod_: function(start, isStatic, isGenerator, name, annotations) {
+      this.eat_(OPEN_PAREN);
+      var formalParameterList = this.parseFormalParameterList_();
+      this.eat_(CLOSE_PAREN);
+      var typeAnnotation = this.parseTypeAnnotationOpt_();
+      var functionBody = this.parseFunctionBody_(isGenerator, formalParameterList);
+      return new PropertyMethodAssignment(this.getTreeLocation_(start), isStatic, isGenerator, name, formalParameterList, typeAnnotation, annotations, functionBody);
+    },
+    parseGetSetOrMethod_: function(start, isStatic, annotations) {
+      var isGenerator = false;
+      var name = this.parsePropertyName_();
+      var type = this.peekType_();
+      if (name.type === LITERAL_PROPERTY_NAME && name.literalToken.value === GET && this.peekPropertyName_(type)) {
+        return this.parseGetAccessor_(start, isStatic, annotations);
+      }
+      if (name.type === LITERAL_PROPERTY_NAME && name.literalToken.value === SET && this.peekPropertyName_(type)) {
+        return this.parseSetAccessor_(start, isStatic, annotations);
+      }
+      return this.parseMethod_(start, isStatic, isGenerator, name, annotations);
+    },
+    parseGetAccessor_: function(start, isStatic, annotations) {
+      var isGenerator = false;
+      var name = this.parsePropertyName_();
+      this.eat_(OPEN_PAREN);
+      this.eat_(CLOSE_PAREN);
+      var typeAnnotation = this.parseTypeAnnotationOpt_();
+      var body = this.parseFunctionBody_(isGenerator, null);
+      return new GetAccessor(this.getTreeLocation_(start), isStatic, name, typeAnnotation, annotations, body);
+    },
+    parseSetAccessor_: function(start, isStatic, annotations) {
+      var isGenerator = false;
+      var name = this.parsePropertyName_();
+      this.eat_(OPEN_PAREN);
+      var parameter = this.parsePropertySetParameterList_();
+      this.eat_(CLOSE_PAREN);
+      var body = this.parseFunctionBody_(isGenerator, parameter);
+      return new SetAccessor(this.getTreeLocation_(start), isStatic, name, parameter, annotations, body);
+    },
+    peekPropertyDefinition_: function(type) {
+      return this.peekPropertyName_(type) || type == STAR && parseOptions.propertyMethods && parseOptions.generators;
+    },
+    peekPropertyName_: function(type) {
+      switch (type) {
+        case IDENTIFIER:
+        case STRING:
+        case NUMBER:
+          return true;
+        case OPEN_SQUARE:
+          return parseOptions.computedPropertyNames;
+        default:
+          return this.peekToken_().isKeyword();
+      }
+    },
+    peekPredefinedString_: function(string) {
+      var token = this.peekToken_();
+      return token.type === IDENTIFIER && token.value === string;
+    },
+    parsePropertySetParameterList_: function() {
+      var start = this.getTreeStartLocation_();
+      var binding;
+      this.pushAnnotations_();
+      if (this.peekPattern_(this.peekType_()))
+        binding = this.parseBindingPattern_();
+      else
+        binding = this.parseBindingIdentifier_();
+      var typeAnnotation = this.parseTypeAnnotationOpt_();
+      return new FormalParameter(this.getTreeLocation_(start), new BindingElement(this.getTreeLocation_(start), binding, null), typeAnnotation, this.popAnnotations_());
+    },
+    parsePrimaryExpressionStartingWithParen_: function() {
+      var start = this.getTreeStartLocation_();
+      this.eat_(OPEN_PAREN);
+      if (this.peek_(FOR) && parseOptions.generatorComprehension)
+        return this.parseGeneratorComprehension_(start);
+      return this.parseCoverFormals_(start);
+    },
+    parseSyntaxError_: function(message) {
+      var start = this.getTreeStartLocation_();
+      this.reportError_(message);
+      var token = this.nextToken_();
+      return new SyntaxErrorTree(this.getTreeLocation_(start), token, message);
+    },
+    parseUnexpectedToken_: function(name) {
+      return this.parseSyntaxError_(("Unexpected token " + name));
+    },
+    peekExpression_: function(type) {
+      switch (type) {
+        case NO_SUBSTITUTION_TEMPLATE:
+        case TEMPLATE_HEAD:
+          return parseOptions.templateLiterals;
+        case BANG:
+        case CLASS:
+        case DELETE:
+        case FALSE:
+        case FUNCTION:
+        case IDENTIFIER:
+        case MINUS:
+        case MINUS_MINUS:
+        case NEW:
+        case NULL:
+        case NUMBER:
+        case OPEN_CURLY:
+        case OPEN_PAREN:
+        case OPEN_SQUARE:
+        case PLUS:
+        case PLUS_PLUS:
+        case SLASH:
+        case SLASH_EQUAL:
+        case STRING:
+        case SUPER:
+        case THIS:
+        case TILDE:
+        case TRUE:
+        case TYPEOF:
+        case VOID:
+        case YIELD:
+          return true;
+        default:
+          return false;
+      }
+    },
+    parseExpression: function() {
+      var expressionIn = arguments[0] !== (void 0) ? arguments[0] : Expression.IN;
+      var start = this.getTreeStartLocation_();
+      var result = this.parseAssignmentExpression(expressionIn);
+      if (this.peek_(COMMA)) {
+        var exprs = [result];
+        while (this.eatIf_(COMMA)) {
+          exprs.push(this.parseAssignmentExpression(expressionIn));
+        }
+        return new CommaExpression(this.getTreeLocation_(start), exprs);
+      }
+      return result;
+    },
+    peekAssignmentExpression_: function(type) {
+      return this.peekExpression_(type);
+    },
+    parseAssignmentExpression: function() {
+      var expressionIn = arguments[0] !== (void 0) ? arguments[0] : Expression.NORMAL;
+      var allowCoverGrammar = arguments[1];
+      if (this.allowYield_ && this.peek_(YIELD))
+        return this.parseYieldExpression_();
+      var start = this.getTreeStartLocation_();
+      var left = this.parseConditional_(expressionIn);
+      var type = this.peekType_();
+      if (type === ARROW && (left.type === COVER_FORMALS || left.type === IDENTIFIER_EXPRESSION)) {
+        return this.parseArrowFunction_(start, left);
+      }
+      if (this.peekAssignmentOperator_(type)) {
+        if (type === EQUAL)
+          left = this.transformLeftHandSideExpression_(left);
+        else
+          left = this.toParenExpression_(left);
+        if (!allowCoverGrammar)
+          this.ensureAssignmenExpression_();
+        if (!left.isLeftHandSideExpression() && !left.isPattern()) {
+          this.reportError_('Left hand side of assignment must be new, call, member, function, primary expressions or destructuring pattern');
+        }
+        var operator = this.nextToken_();
+        var right = this.parseAssignmentExpression(expressionIn);
+        return new BinaryOperator(this.getTreeLocation_(start), left, operator, right);
+      }
+      left = this.toParenExpression_(left);
+      if (!allowCoverGrammar)
+        this.ensureAssignmenExpression_();
+      return left;
+    },
+    ensureAssignmenExpression_: function() {
+      if (this.coverInitialisedName_) {
+        var token = this.coverInitialisedName_.equalToken;
+        this.reportError_(token.location, ("Unexpected token '" + token + "'"));
+        this.coverInitialisedName_ = null;
+      }
+    },
+    transformLeftHandSideExpression_: function(tree) {
+      switch (tree.type) {
+        case ARRAY_LITERAL_EXPRESSION:
+        case OBJECT_LITERAL_EXPRESSION:
+          var transformer = new AssignmentPatternTransformer();
+          var transformedTree;
+          try {
+            transformedTree = transformer.transformAny(tree);
+          } catch (ex) {
+            if (!(ex instanceof AssignmentPatternTransformerError))
+              throw ex;
+          }
+          if (transformedTree) {
+            this.coverInitialisedName_ = null;
+            return transformedTree;
+          }
+          break;
+        case PAREN_EXPRESSION:
+          var expression = this.transformLeftHandSideExpression_(tree.expression);
+          if (expression !== tree.expression)
+            return new ParenExpression(tree.location, expression);
+      }
+      return tree;
+    },
+    peekAssignmentOperator_: function(type) {
+      return isAssignmentOperator(type);
+    },
+    parseConditional_: function(expressionIn) {
+      var start = this.getTreeStartLocation_();
+      var condition = this.parseLogicalOR_(expressionIn);
+      if (this.eatIf_(QUESTION)) {
+        condition = this.toParenExpression_(condition);
+        var left = this.parseAssignmentExpression();
+        this.eat_(COLON);
+        var right = this.parseAssignmentExpression(expressionIn);
+        return new ConditionalExpression(this.getTreeLocation_(start), condition, left, right);
+      }
+      return condition;
+    },
+    newBinaryOperator_: function(start, left, operator, right) {
+      left = this.toParenExpression_(left);
+      right = this.toParenExpression_(right);
+      return new BinaryOperator(this.getTreeLocation_(start), left, operator, right);
+    },
+    parseLogicalOR_: function(expressionIn) {
+      var start = this.getTreeStartLocation_();
+      var left = this.parseLogicalAND_(expressionIn);
+      var operator;
+      while (operator = this.eatOpt_(OR)) {
+        var right = this.parseLogicalAND_(expressionIn);
+        left = this.newBinaryOperator_(start, left, operator, right);
+      }
+      return left;
+    },
+    parseLogicalAND_: function(expressionIn) {
+      var start = this.getTreeStartLocation_();
+      var left = this.parseBitwiseOR_(expressionIn);
+      var operator;
+      while (operator = this.eatOpt_(AND)) {
+        var right = this.parseBitwiseOR_(expressionIn);
+        left = this.newBinaryOperator_(start, left, operator, right);
+      }
+      return left;
+    },
+    parseBitwiseOR_: function(expressionIn) {
+      var start = this.getTreeStartLocation_();
+      var left = this.parseBitwiseXOR_(expressionIn);
+      var operator;
+      while (operator = this.eatOpt_(BAR)) {
+        var right = this.parseBitwiseXOR_(expressionIn);
+        left = this.newBinaryOperator_(start, left, operator, right);
+      }
+      return left;
+    },
+    parseBitwiseXOR_: function(expressionIn) {
+      var start = this.getTreeStartLocation_();
+      var left = this.parseBitwiseAND_(expressionIn);
+      var operator;
+      while (operator = this.eatOpt_(CARET)) {
+        var right = this.parseBitwiseAND_(expressionIn);
+        left = this.newBinaryOperator_(start, left, operator, right);
+      }
+      return left;
+    },
+    parseBitwiseAND_: function(expressionIn) {
+      var start = this.getTreeStartLocation_();
+      var left = this.parseEquality_(expressionIn);
+      var operator;
+      while (operator = this.eatOpt_(AMPERSAND)) {
+        var right = this.parseEquality_(expressionIn);
+        left = this.newBinaryOperator_(start, left, operator, right);
+      }
+      return left;
+    },
+    parseEquality_: function(expressionIn) {
+      var start = this.getTreeStartLocation_();
+      var left = this.parseRelational_(expressionIn);
+      while (this.peekEqualityOperator_(this.peekType_())) {
+        var operator = this.nextToken_();
+        var right = this.parseRelational_(expressionIn);
+        left = this.newBinaryOperator_(start, left, operator, right);
+      }
+      return left;
+    },
+    peekEqualityOperator_: function(type) {
+      switch (type) {
+        case EQUAL_EQUAL:
+        case NOT_EQUAL:
+        case EQUAL_EQUAL_EQUAL:
+        case NOT_EQUAL_EQUAL:
+          return true;
+      }
+      return false;
+    },
+    parseRelational_: function(expressionIn) {
+      var start = this.getTreeStartLocation_();
+      var left = this.parseShiftExpression_();
+      while (this.peekRelationalOperator_(expressionIn)) {
+        var operator = this.nextToken_();
+        var right = this.parseShiftExpression_();
+        left = this.newBinaryOperator_(start, left, operator, right);
+      }
+      return left;
+    },
+    peekRelationalOperator_: function(expressionIn) {
+      switch (this.peekType_()) {
+        case OPEN_ANGLE:
+        case CLOSE_ANGLE:
+        case GREATER_EQUAL:
+        case LESS_EQUAL:
+        case INSTANCEOF:
+          return true;
+        case IN:
+          return expressionIn == Expression.NORMAL;
+        default:
+          return false;
+      }
+    },
+    parseShiftExpression_: function() {
+      var start = this.getTreeStartLocation_();
+      var left = this.parseAdditiveExpression_();
+      while (this.peekShiftOperator_(this.peekType_())) {
+        var operator = this.nextToken_();
+        var right = this.parseAdditiveExpression_();
+        left = this.newBinaryOperator_(start, left, operator, right);
+      }
+      return left;
+    },
+    peekShiftOperator_: function(type) {
+      switch (type) {
+        case LEFT_SHIFT:
+        case RIGHT_SHIFT:
+        case UNSIGNED_RIGHT_SHIFT:
+          return true;
+        default:
+          return false;
+      }
+    },
+    parseAdditiveExpression_: function() {
+      var start = this.getTreeStartLocation_();
+      var left = this.parseMultiplicativeExpression_();
+      while (this.peekAdditiveOperator_(this.peekType_())) {
+        var operator = this.nextToken_();
+        var right = this.parseMultiplicativeExpression_();
+        left = this.newBinaryOperator_(start, left, operator, right);
+      }
+      return left;
+    },
+    peekAdditiveOperator_: function(type) {
+      switch (type) {
+        case PLUS:
+        case MINUS:
+          return true;
+        default:
+          return false;
+      }
+    },
+    parseMultiplicativeExpression_: function() {
+      var start = this.getTreeStartLocation_();
+      var left = this.parseUnaryExpression_();
+      while (this.peekMultiplicativeOperator_(this.peekType_())) {
+        var operator = this.nextToken_();
+        var right = this.parseUnaryExpression_();
+        left = this.newBinaryOperator_(start, left, operator, right);
+      }
+      return left;
+    },
+    peekMultiplicativeOperator_: function(type) {
+      switch (type) {
+        case STAR:
+        case SLASH:
+        case PERCENT:
+          return true;
+        default:
+          return false;
+      }
+    },
+    parseUnaryExpression_: function() {
+      var start = this.getTreeStartLocation_();
+      if (this.peekUnaryOperator_(this.peekType_())) {
+        var operator = this.nextToken_();
+        var operand = this.parseUnaryExpression_();
+        operand = this.toParenExpression_(operand);
+        return new UnaryExpression(this.getTreeLocation_(start), operator, operand);
+      }
+      return this.parsePostfixExpression_();
+    },
+    peekUnaryOperator_: function(type) {
+      switch (type) {
+        case DELETE:
+        case VOID:
+        case TYPEOF:
+        case PLUS_PLUS:
+        case MINUS_MINUS:
+        case PLUS:
+        case MINUS:
+        case TILDE:
+        case BANG:
+          return true;
+        default:
+          return false;
+      }
+    },
+    parsePostfixExpression_: function() {
+      var start = this.getTreeStartLocation_();
+      var operand = this.parseLeftHandSideExpression_();
+      while (this.peekPostfixOperator_(this.peekType_())) {
+        operand = this.toParenExpression_(operand);
+        var operator = this.nextToken_();
+        operand = new PostfixExpression(this.getTreeLocation_(start), operand, operator);
+      }
+      return operand;
+    },
+    peekPostfixOperator_: function(type) {
+      switch (type) {
+        case PLUS_PLUS:
+        case MINUS_MINUS:
+          var token = this.peekTokenNoLineTerminator_();
+          return token !== null;
+      }
+      return false;
+    },
+    parseLeftHandSideExpression_: function() {
+      var start = this.getTreeStartLocation_();
+      var operand = this.parseNewExpression_();
+      if (!(operand instanceof NewExpression) || operand.args != null) {
+        loop: while (true) {
+          switch (this.peekType_()) {
+            case OPEN_PAREN:
+              operand = this.toParenExpression_(operand);
+              operand = this.parseCallExpression_(start, operand);
+              break;
+            case OPEN_SQUARE:
+              operand = this.toParenExpression_(operand);
+              operand = this.parseMemberLookupExpression_(start, operand);
+              break;
+            case PERIOD:
+              operand = this.toParenExpression_(operand);
+              operand = this.parseMemberExpression_(start, operand);
+              break;
+            case NO_SUBSTITUTION_TEMPLATE:
+            case TEMPLATE_HEAD:
+              if (!parseOptions.templateLiterals)
+                break loop;
+              operand = this.toParenExpression_(operand);
+              operand = this.parseTemplateLiteral_(operand);
+              break;
+            default:
+              break loop;
+          }
+        }
+      }
+      return operand;
+    },
+    parseMemberExpressionNoNew_: function() {
+      var start = this.getTreeStartLocation_();
+      var operand;
+      if (this.peekType_() === FUNCTION) {
+        operand = this.parseFunctionExpression_();
+      } else {
+        operand = this.parsePrimaryExpression_();
+      }
+      loop: while (true) {
+        switch (this.peekType_()) {
+          case OPEN_SQUARE:
+            operand = this.toParenExpression_(operand);
+            operand = this.parseMemberLookupExpression_(start, operand);
+            break;
+          case PERIOD:
+            operand = this.toParenExpression_(operand);
+            operand = this.parseMemberExpression_(start, operand);
+            break;
+          case NO_SUBSTITUTION_TEMPLATE:
+          case TEMPLATE_HEAD:
+            if (!parseOptions.templateLiterals)
+              break loop;
+            operand = this.toParenExpression_(operand);
+            operand = this.parseTemplateLiteral_(operand);
+            break;
+          default:
+            break loop;
+        }
+      }
+      return operand;
+    },
+    parseMemberExpression_: function(start, operand) {
+      this.nextToken_();
+      var name = this.eatIdName_();
+      return new MemberExpression(this.getTreeLocation_(start), operand, name);
+    },
+    parseMemberLookupExpression_: function(start, operand) {
+      this.nextToken_();
+      var member = this.parseExpression();
+      this.eat_(CLOSE_SQUARE);
+      return new MemberLookupExpression(this.getTreeLocation_(start), operand, member);
+    },
+    parseCallExpression_: function(start, operand) {
+      var args = this.parseArguments_();
+      return new CallExpression(this.getTreeLocation_(start), operand, args);
+    },
+    parseNewExpression_: function() {
+      var operand;
+      switch (this.peekType_()) {
+        case NEW:
+          var start = this.getTreeStartLocation_();
+          this.eat_(NEW);
+          if (this.peek_(SUPER))
+            operand = this.parseSuperExpression_();
+          else
+            operand = this.toParenExpression_(this.parseNewExpression_());
+          var args = null;
+          if (this.peek_(OPEN_PAREN)) {
+            args = this.parseArguments_();
+          }
+          return new NewExpression(this.getTreeLocation_(start), operand, args);
+        case SUPER:
+          operand = this.parseSuperExpression_();
+          var type = this.peekType_();
+          switch (type) {
+            case OPEN_SQUARE:
+              return this.parseMemberLookupExpression_(start, operand);
+            case PERIOD:
+              return this.parseMemberExpression_(start, operand);
+            case OPEN_PAREN:
+              return this.parseCallExpression_(start, operand);
+            default:
+              return this.parseUnexpectedToken_(type);
+          }
+          break;
+        default:
+          return this.parseMemberExpressionNoNew_();
+      }
+    },
+    parseArguments_: function() {
+      var start = this.getTreeStartLocation_();
+      var args = [];
+      this.eat_(OPEN_PAREN);
+      if (!this.peek_(CLOSE_PAREN)) {
+        args.push(this.parseArgument_());
+        while (this.eatIf_(COMMA)) {
+          args.push(this.parseArgument_());
+        }
+      }
+      this.eat_(CLOSE_PAREN);
+      return new ArgumentList(this.getTreeLocation_(start), args);
+    },
+    parseArgument_: function() {
+      if (this.peekSpread_(this.peekType_()))
+        return this.parseSpreadExpression_();
+      return this.parseAssignmentExpression();
+    },
+    parseArrowFunction_: function(start, tree) {
+      var formals;
+      if (tree.type === IDENTIFIER_EXPRESSION) {
+        var id = new BindingIdentifier(tree.location, tree.identifierToken);
+        var formals = new FormalParameterList(this.getTreeLocation_(start), [new FormalParameter(id.location, new BindingElement(id.location, id, null), null, [])]);
+      } else {
+        formals = this.toFormalParameters_(tree);
+      }
+      this.eat_(ARROW);
+      var body = this.parseConciseBody_();
+      return new ArrowFunctionExpression(this.getTreeLocation_(start), formals, body);
+    },
+    parseCoverFormals_: function(start) {
+      var expressions = [];
+      if (!this.peek_(CLOSE_PAREN)) {
+        do {
+          var type = this.peekType_();
+          if (this.peekRest_(type)) {
+            expressions.push(this.parseRestParameter_());
+            break;
+          } else {
+            expressions.push(this.parseAssignmentExpression(Expression.NORMAL, true));
+          }
+          if (this.eatIf_(COMMA))
+            continue;
+        } while (!this.peek_(CLOSE_PAREN) && !this.isAtEnd());
+      }
+      this.eat_(CLOSE_PAREN);
+      return new CoverFormals(this.getTreeLocation_(start), expressions);
+    },
+    transformCoverFormals_: function(f, tree) {
+      try {
+        return f(tree);
+      } catch (ex) {
+        if (!(ex instanceof CoverFormalsTransformerError))
+          throw ex;
+        this.reportError_(ex.location, ex.message);
+        return new SyntaxErrorTree(ex.location, null, ex.message);
+      }
+    },
+    toParenExpression_: function(tree) {
+      if (tree.type !== COVER_FORMALS)
+        return tree;
+      return this.transformCoverFormals_(toParenExpression, tree);
+    },
+    toFormalParameters_: function(tree) {
+      if (tree.type !== COVER_FORMALS)
+        return tree;
+      var transformed = this.transformCoverFormals_(toFormalParameters, tree);
+      this.coverInitialisedName_ = null;
+      return transformed;
+    },
+    transformCoverFormalsToArrowFormals_: function(coverFormals) {
+      var formals = null;
+      try {
+        formals = toFormalParameters(coverFormals);
+      } catch (ex) {
+        if (!(ex instanceof CoverFormalsTransformerError))
+          throw ex;
+      }
+      return formals;
+    },
+    peekArrow_: function(type) {
+      return type === ARROW && parseOptions.arrowFunctions;
+    },
+    parseConciseBody_: function() {
+      if (this.peek_(OPEN_CURLY))
+        return this.parseFunctionBody_();
+      return this.parseAssignmentExpression();
+    },
+    parseGeneratorComprehension_: function(start) {
+      var comprehensionList = this.parseComprehensionList_();
+      var expression = this.parseAssignmentExpression();
+      this.eat_(CLOSE_PAREN);
+      return new GeneratorComprehension(this.getTreeLocation_(start), comprehensionList, expression);
+    },
+    parseForBinding_: function() {
+      if (this.peekPattern_(this.peekType_()))
+        return this.parseBindingPattern_();
+      return this.parseBindingIdentifier_();
+    },
+    peekPattern_: function(type) {
+      return parseOptions.destructuring && (this.peekObjectPattern_(type) || this.peekArrayPattern_(type));
+    },
+    peekArrayPattern_: function(type) {
+      return type === OPEN_SQUARE;
+    },
+    peekObjectPattern_: function(type) {
+      return type === OPEN_CURLY;
+    },
+    parseBindingPattern_: function() {
+      if (this.peekArrayPattern_(this.peekType_()))
+        return this.parseArrayBindingPattern_();
+      return this.parseObjectBindingPattern_();
+    },
+    parseArrayBindingPattern_: function() {
+      var start = this.getTreeStartLocation_();
+      var elements = [];
+      this.eat_(OPEN_SQUARE);
+      var type;
+      while ((type = this.peekType_()) === COMMA || this.peekBindingElement_(type) || this.peekRest_(type)) {
+        this.parseElisionOpt_(elements);
+        if (this.peekRest_(this.peekType_())) {
+          elements.push(this.parseBindingRestElement_());
+          break;
+        } else {
+          elements.push(this.parseBindingElement_());
+          if (this.peek_(COMMA) && !this.peek_(CLOSE_SQUARE, 1)) {
+            this.nextToken_();
+          }
+        }
+      }
+      this.eat_(CLOSE_SQUARE);
+      return new ArrayPattern(this.getTreeLocation_(start), elements);
+    },
+    parseBindingElementList_: function(elements) {
+      this.parseElisionOpt_(elements);
+      elements.push(this.parseBindingElement_());
+      while (this.eatIf_(COMMA)) {
+        this.parseElisionOpt_(elements);
+        elements.push(this.parseBindingElement_());
+      }
+    },
+    parseElisionOpt_: function(elements) {
+      while (this.eatIf_(COMMA)) {
+        elements.push(null);
+      }
+    },
+    peekBindingElement_: function(type) {
+      return this.peekBindingIdentifier_(type) || this.peekPattern_(type);
+    },
+    parseBindingElement_: function() {
+      var initialiser = arguments[0] !== (void 0) ? arguments[0] : Initialiser.OPTIONAL;
+      var start = this.getTreeStartLocation_();
+      var binding = this.parseBindingElementBinding_();
+      var initialiser = this.parseBindingElementInitialiser_(initialiser);
+      return new BindingElement(this.getTreeLocation_(start), binding, initialiser);
+    },
+    parseBindingElementBinding_: function() {
+      if (this.peekPattern_(this.peekType_()))
+        return this.parseBindingPattern_();
+      return this.parseBindingIdentifier_();
+    },
+    parseBindingElementInitialiser_: function() {
+      var initialiser = arguments[0] !== (void 0) ? arguments[0] : Initialiser.OPTIONAL;
+      if (this.peek_(EQUAL) || initialiser === Initialiser.REQUIRED) {
+        return this.parseInitialiser_();
+      }
+      return null;
+    },
+    parseBindingRestElement_: function() {
+      var start = this.getTreeStartLocation_();
+      this.eat_(DOT_DOT_DOT);
+      var identifier = this.parseBindingIdentifier_();
+      return new SpreadPatternElement(this.getTreeLocation_(start), identifier);
+    },
+    parseObjectBindingPattern_: function() {
+      var start = this.getTreeStartLocation_();
+      var elements = [];
+      this.eat_(OPEN_CURLY);
+      while (this.peekBindingProperty_(this.peekType_())) {
+        elements.push(this.parseBindingProperty_());
+        if (!this.eatIf_(COMMA))
+          break;
+      }
+      this.eat_(CLOSE_CURLY);
+      return new ObjectPattern(this.getTreeLocation_(start), elements);
+    },
+    peekBindingProperty_: function(type) {
+      return this.peekBindingIdentifier_(type) || this.peekPropertyName_(type);
+    },
+    parseBindingProperty_: function() {
+      var start = this.getTreeStartLocation_();
+      var name = this.parsePropertyName_();
+      var requireColon = name.type !== LITERAL_PROPERTY_NAME || !name.literalToken.isStrictKeyword() && name.literalToken.type !== IDENTIFIER;
+      if (requireColon || this.peek_(COLON)) {
+        this.eat_(COLON);
+        var binding = this.parseBindingElement_();
+        return new ObjectPatternField(this.getTreeLocation_(start), name, binding);
+      }
+      var token = name.literalToken;
+      if (this.strictMode_ && token.isStrictKeyword())
+        this.reportReservedIdentifier_(token);
+      var binding = new BindingIdentifier(name.location, token);
+      var initialiser = null;
+      if (this.peek_(EQUAL))
+        initialiser = this.parseInitialiser_();
+      return new BindingElement(this.getTreeLocation_(start), binding, initialiser);
+    },
+    parseTemplateLiteral_: function(operand) {
+      if (!parseOptions.templateLiterals)
+        return this.parseUnexpectedToken_('`');
+      var start = operand ? operand.location.start : this.getTreeStartLocation_();
+      var token = this.nextToken_();
+      var elements = [new TemplateLiteralPortion(token.location, token)];
+      if (token.type === NO_SUBSTITUTION_TEMPLATE) {
+        return new TemplateLiteralExpression(this.getTreeLocation_(start), operand, elements);
+      }
+      var expression = this.parseExpression();
+      elements.push(new TemplateSubstitution(expression.location, expression));
+      while (expression.type !== SYNTAX_ERROR_TREE) {
+        token = this.nextTemplateLiteralToken_();
+        if (token.type === ERROR || token.type === END_OF_FILE)
+          break;
+        elements.push(new TemplateLiteralPortion(token.location, token));
+        if (token.type === TEMPLATE_TAIL)
+          break;
+        expression = this.parseExpression();
+        elements.push(new TemplateSubstitution(expression.location, expression));
+      }
+      return new TemplateLiteralExpression(this.getTreeLocation_(start), operand, elements);
+    },
+    parseTypeAnnotationOpt_: function() {
+      if (parseOptions.types && this.eatOpt_(COLON)) {
+        return this.parseType_();
+      }
+      return null;
+    },
+    parseType_: function() {
+      var start = this.getTreeStartLocation_();
+      var elementType;
+      switch (this.peekType_()) {
+        case IDENTIFIER:
+          elementType = this.parseNamedOrPredefinedType_();
+          break;
+        case NEW:
+          elementType = this.parseConstructorType_();
+          break;
+        case OPEN_CURLY:
+          elementType = this.parseObjectType_();
+          break;
+        case OPEN_PAREN:
+          elementType = this.parseFunctionType_();
+          break;
+        case VOID:
+          var token = this.nextToken_();
+          return new PredefinedType(this.getTreeLocation_(start), token);
+        default:
+          return this.parseUnexpectedToken_(this.peekToken_());
+      }
+      return this.parseArrayTypeSuffix_(start, elementType);
+    },
+    parseArrayTypeSuffix_: function(start, elementType) {
+      return elementType;
+    },
+    parseConstructorType_: function() {
+      throw 'NYI';
+    },
+    parseObjectType_: function() {
+      throw 'NYI';
+    },
+    parseFunctionType_: function() {
+      throw 'NYI';
+    },
+    parseNamedOrPredefinedType_: function() {
+      var start = this.getTreeStartLocation_();
+      switch (this.peekToken_().value) {
+        case 'any':
+        case 'number':
+        case 'boolean':
+        case 'string':
+          var token = this.nextToken_();
+          return new PredefinedType(this.getTreeLocation_(start), token);
+        default:
+          return this.parseTypeName_();
+      }
+    },
+    parseTypeName_: function() {
+      var start = this.getTreeStartLocation_();
+      var typeName = new TypeName(this.getTreeLocation_(start), null, this.eatId_());
+      while (this.eatIf_(PERIOD)) {
+        var memberName = this.eatIdName_();
+        typeName = new TypeName(this.getTreeLocation_(start), typeName, memberName);
+      }
+      return typeName;
+    },
+    parseAnnotatedDeclarations_: function(allowModuleItem, allowScriptItem) {
+      this.pushAnnotations_();
+      var declaration = this.parseStatement_(this.peekType_(), allowModuleItem, allowScriptItem);
+      if (this.annotations_.length > 0)
+        return this.parseSyntaxError_('Unsupported annotated expression');
+      return declaration;
+    },
+    parseAnnotations_: function() {
+      var annotations = [];
+      while (this.eatIf_(AT)) {
+        annotations.push(this.parseAnnotation_());
+      }
+      return annotations;
+    },
+    pushAnnotations_: function() {
+      this.annotations_ = this.parseAnnotations_();
+    },
+    popAnnotations_: function() {
+      var annotations = this.annotations_;
+      this.annotations_ = [];
+      return annotations;
+    },
+    parseAnnotation_: function() {
+      var start = this.getTreeStartLocation_();
+      var expression = this.parseMemberExpressionNoNew_();
+      var args = null;
+      if (this.peek_(OPEN_PAREN))
+        args = this.parseArguments_();
+      return new Annotation(this.getTreeLocation_(start), expression, args);
+    },
+    eatPossibleImplicitSemiColon_: function() {
+      var token = this.peekTokenNoLineTerminator_();
+      if (!token)
+        return;
+      switch (token.type) {
+        case SEMI_COLON:
+          this.nextToken_();
+          return;
+        case END_OF_FILE:
+        case CLOSE_CURLY:
+          return;
+      }
+      this.reportError_('Semi-colon expected');
+    },
+    peekImplicitSemiColon_: function() {
+      switch (this.peekType_()) {
+        case SEMI_COLON:
+        case CLOSE_CURLY:
+        case END_OF_FILE:
+          return true;
+      }
+      var token = this.peekTokenNoLineTerminator_();
+      return token === null;
+    },
+    eatOpt_: function(expectedTokenType) {
+      if (this.peek_(expectedTokenType))
+        return this.nextToken_();
+      return null;
+    },
+    eatIdOpt_: function() {
+      return this.peek_(IDENTIFIER) ? this.eatId_() : null;
+    },
+    eatId_: function() {
+      var expected = arguments[0];
+      var token = this.nextToken_();
+      if (!token) {
+        if (expected)
+          this.reportError_(this.peekToken_(), ("expected '" + expected + "'"));
+        return null;
+      }
+      if (token.type === IDENTIFIER)
+        return token;
+      if (token.isStrictKeyword()) {
+        if (this.strictMode_) {
+          this.reportReservedIdentifier_(token);
+        } else {
+          return new IdentifierToken(token.location, token.type);
+        }
+      } else {
+        this.reportExpectedError_(token, expected || 'identifier');
+      }
+      return token;
+    },
+    eatIdName_: function() {
+      var t = this.nextToken_();
+      if (t.type != IDENTIFIER) {
+        if (!t.isKeyword()) {
+          this.reportExpectedError_(t, 'identifier');
+          return null;
+        }
+        return new IdentifierToken(t.location, t.type);
+      }
+      return t;
+    },
+    eat_: function(expectedTokenType) {
+      var token = this.nextToken_();
+      if (token.type != expectedTokenType) {
+        this.reportExpectedError_(token, expectedTokenType);
+        return null;
+      }
+      return token;
+    },
+    eatIf_: function(expectedTokenType) {
+      if (this.peek_(expectedTokenType)) {
+        this.nextToken_();
+        return true;
+      }
+      return false;
+    },
+    reportExpectedError_: function(token, expected) {
+      this.reportError_(token, "'" + expected + "' expected");
+    },
+    getTreeStartLocation_: function() {
+      return this.peekToken_().location.start;
+    },
+    getTreeEndLocation_: function() {
+      return this.scanner_.lastToken.location.end;
+    },
+    getTreeLocation_: function(start) {
+      return new SourceRange(start, this.getTreeEndLocation_());
+    },
+    handleComment: function(range) {},
+    nextToken_: function() {
+      return this.scanner_.nextToken();
+    },
+    nextRegularExpressionLiteralToken_: function() {
+      return this.scanner_.nextRegularExpressionLiteralToken();
+    },
+    nextTemplateLiteralToken_: function() {
+      return this.scanner_.nextTemplateLiteralToken();
+    },
+    isAtEnd: function() {
+      return this.scanner_.isAtEnd();
+    },
+    peek_: function(expectedType, opt_index) {
+      return this.peekToken_(opt_index).type === expectedType;
+    },
+    peekType_: function() {
+      return this.peekToken_().type;
+    },
+    peekToken_: function(opt_index) {
+      return this.scanner_.peekToken(opt_index);
+    },
+    peekTokenNoLineTerminator_: function() {
+      return this.scanner_.peekTokenNoLineTerminator();
+    },
+    reportError_: function() {
+      for (var args = [],
+          $__64 = 0; $__64 < arguments.length; $__64++)
+        args[$__64] = arguments[$__64];
+      if (args.length == 1) {
+        this.errorReporter_.reportError(this.scanner_.getPosition(), args[0]);
+      } else {
+        var location = args[0];
+        if (location instanceof Token) {
+          location = location.location;
+        }
+        this.errorReporter_.reportError(location.start, args[1]);
+      }
+    },
+    reportReservedIdentifier_: function(token) {
+      this.reportError_(token, (token.type + " is a reserved identifier"));
+    }
+  }, {});
+  return {get Parser() {
+      return Parser;
+    }};
+});
+System.register("traceur@0.0.32/src/util/uid", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/util/uid";
+  var uidCounter = 0;
+  function getUid() {
+    return uidCounter++;
+  }
+  return {get getUid() {
+      return getUid;
+    }};
+});
+System.register("traceur@0.0.32/src/util/SourcePosition", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/util/SourcePosition";
+  var SourcePosition = function SourcePosition(source, offset) {
+    this.source = source;
+    this.offset = offset;
+    this.line_ = -1;
+    this.column_ = -1;
+  };
+  ($traceurRuntime.createClass)(SourcePosition, {
+    get line() {
+      if (this.line_ === -1)
+        this.line_ = this.source.lineNumberTable.getLine(this.offset);
+      return this.line_;
+    },
+    get column() {
+      if (this.column_ === -1)
+        this.column_ = this.source.lineNumberTable.getColumn(this.offset);
+      return this.column_;
+    },
+    toString: function() {
+      var name = this.source ? this.source.name : '';
+      return (name + ":" + (this.line + 1) + ":" + (this.column + 1));
+    }
+  }, {});
+  return {get SourcePosition() {
+      return SourcePosition;
+    }};
+});
+System.register("traceur@0.0.32/src/syntax/LineNumberTable", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/syntax/LineNumberTable";
+  var SourcePosition = System.get("traceur@0.0.32/src/util/SourcePosition").SourcePosition;
+  var SourceRange = System.get("traceur@0.0.32/src/util/SourceRange").SourceRange;
+  var isLineTerminator = System.get("traceur@0.0.32/src/syntax/Scanner").isLineTerminator;
+  var MAX_INT_REPRESENTATION = 9007199254740992;
+  function computeLineStartOffsets(source) {
+    var lineStartOffsets = [0];
+    var k = 1;
+    for (var index = 0; index < source.length; index++) {
+      var code = source.charCodeAt(index);
+      if (isLineTerminator(code)) {
+        if (code === 13 && source.charCodeAt(index + 1) === 10) {
+          index++;
+        }
+        lineStartOffsets[k++] = index + 1;
+      }
+    }
+    lineStartOffsets[k++] = MAX_INT_REPRESENTATION;
+    return lineStartOffsets;
+  }
+  var LineNumberTable = function LineNumberTable(sourceFile) {
+    this.sourceFile_ = sourceFile;
+    this.lineStartOffsets_ = null;
+    this.lastLine_ = 0;
+    this.lastOffset_ = -1;
+  };
+  ($traceurRuntime.createClass)(LineNumberTable, {
+    ensureLineStartOffsets_: function() {
+      if (!this.lineStartOffsets_) {
+        this.lineStartOffsets_ = computeLineStartOffsets(this.sourceFile_.contents);
+      }
+    },
+    getSourcePosition: function(offset) {
+      return new SourcePosition(this.sourceFile_, offset);
+    },
+    getLine: function(offset) {
+      if (offset === this.lastOffset_)
+        return this.lastLine_;
+      this.ensureLineStartOffsets_();
+      if (offset < 0)
+        return 0;
+      var line;
+      if (offset < this.lastOffset_) {
+        for (var i = this.lastLine_; i >= 0; i--) {
+          if (this.lineStartOffsets_[i] <= offset) {
+            line = i;
+            break;
+          }
+        }
+      } else {
+        for (var i = this.lastLine_; true; i++) {
+          if (this.lineStartOffsets_[i] > offset) {
+            line = i - 1;
+            break;
+          }
+        }
+      }
+      this.lastLine_ = line;
+      this.lastOffset_ = offset;
+      return line;
+    },
+    offsetOfLine: function(line) {
+      this.ensureLineStartOffsets_();
+      return this.lineStartOffsets_[line];
+    },
+    getColumn: function(offset) {
+      var line = this.getLine(offset);
+      return offset - this.lineStartOffsets_[line];
+    },
+    getSourceRange: function(startOffset, endOffset) {
+      return new SourceRange(this.getSourcePosition(startOffset), this.getSourcePosition(endOffset));
+    }
+  }, {});
+  return {get LineNumberTable() {
+      return LineNumberTable;
+    }};
+});
+System.register("traceur@0.0.32/src/syntax/SourceFile", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/syntax/SourceFile";
+  var LineNumberTable = System.get("traceur@0.0.32/src/syntax/LineNumberTable").LineNumberTable;
+  var getUid = System.get("traceur@0.0.32/src/util/uid").getUid;
+  var SourceFile = function SourceFile(name, contents) {
+    this.name = name;
+    this.contents = contents;
+    this.lineNumberTable = new LineNumberTable(this);
+    this.uid = getUid();
+  };
+  ($traceurRuntime.createClass)(SourceFile, {}, {});
+  return {get SourceFile() {
+      return SourceFile;
+    }};
+});
+System.register("traceur@0.0.32/src/util/ArrayMap", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/util/ArrayMap";
+  var ArrayMap = function ArrayMap() {
+    this.values_ = [];
+    this.keys_ = [];
+  };
+  ($traceurRuntime.createClass)(ArrayMap, {
+    has: function(key) {
+      return this.keys_.indexOf(key) != -1;
+    },
+    get: function(key) {
+      var index = this.keys_.indexOf(key);
+      if (index == -1) {
+        return undefined;
+      }
+      return this.values_[index];
+    },
+    set: function(key, value) {
+      var index = this.keys_.indexOf(key);
+      if (index == -1) {
+        this.keys_.push(key);
+        this.values_.push(value);
+      } else {
+        this.values_[index] = value;
+      }
+    },
+    addAll: function(other) {
+      var keys = other.keys();
+      var values = other.values();
+      for (var i = 0; i < keys.length; i++) {
+        this.set(keys[i], values[i]);
+      }
+    },
+    remove: function(key) {
+      var index = this.keys_.indexOf(key);
+      if (index == -1) {
+        return;
+      }
+      this.keys_.splice(index, 1);
+      this.values_.splice(index, 1);
+    },
+    keys: function() {
+      return this.keys_.concat();
+    },
+    values: function() {
+      return this.values_.concat();
+    }
+  }, {});
+  return {get ArrayMap() {
+      return ArrayMap;
+    }};
+});
+System.register("traceur@0.0.32/src/util/MutedErrorReporter", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/util/MutedErrorReporter";
+  var ErrorReporter = System.get("traceur@0.0.32/src/util/ErrorReporter").ErrorReporter;
+  var MutedErrorReporter = function MutedErrorReporter() {
+    $traceurRuntime.defaultSuperCall(this, $MutedErrorReporter.prototype, arguments);
+  };
+  var $MutedErrorReporter = MutedErrorReporter;
+  ($traceurRuntime.createClass)(MutedErrorReporter, {reportMessageInternal: function(location, format, args) {}}, {}, ErrorReporter);
+  return {get MutedErrorReporter() {
+      return MutedErrorReporter;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/PlaceholderParser", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/PlaceholderParser";
+  var ArrayMap = System.get("traceur@0.0.32/src/util/ArrayMap").ArrayMap;
+  var $__79 = System.get("traceur@0.0.32/src/syntax/trees/ParseTreeType"),
+      ARGUMENT_LIST = $__79.ARGUMENT_LIST,
+      BLOCK = $__79.BLOCK,
+      EXPRESSION_STATEMENT = $__79.EXPRESSION_STATEMENT,
+      IDENTIFIER_EXPRESSION = $__79.IDENTIFIER_EXPRESSION;
+  var IdentifierToken = System.get("traceur@0.0.32/src/syntax/IdentifierToken").IdentifierToken;
+  var LiteralToken = System.get("traceur@0.0.32/src/syntax/LiteralToken").LiteralToken;
+  var MutedErrorReporter = System.get("traceur@0.0.32/src/util/MutedErrorReporter").MutedErrorReporter;
+  var ParseTree = System.get("traceur@0.0.32/src/syntax/trees/ParseTree").ParseTree;
+  var ParseTreeTransformer = System.get("traceur@0.0.32/src/codegeneration/ParseTreeTransformer").ParseTreeTransformer;
+  var Parser = System.get("traceur@0.0.32/src/syntax/Parser").Parser;
+  var $__79 = System.get("traceur@0.0.32/src/syntax/trees/ParseTrees"),
+      LiteralExpression = $__79.LiteralExpression,
+      LiteralPropertyName = $__79.LiteralPropertyName,
+      PropertyMethodAssignment = $__79.PropertyMethodAssignment,
+      PropertyNameAssignment = $__79.PropertyNameAssignment,
+      PropertyNameShorthand = $__79.PropertyNameShorthand;
+  var SourceFile = System.get("traceur@0.0.32/src/syntax/SourceFile").SourceFile;
+  var IDENTIFIER = System.get("traceur@0.0.32/src/syntax/TokenType").IDENTIFIER;
+  var $__79 = System.get("traceur@0.0.32/src/codegeneration/ParseTreeFactory"),
+      createArrayLiteralExpression = $__79.createArrayLiteralExpression,
+      createBindingIdentifier = $__79.createBindingIdentifier,
+      createBlock = $__79.createBlock,
+      createBooleanLiteral = $__79.createBooleanLiteral,
+      createCommaExpression = $__79.createCommaExpression,
+      createExpressionStatement = $__79.createExpressionStatement,
+      createFunctionBody = $__79.createFunctionBody,
+      createGetAccessor = $__79.createGetAccessor,
+      createIdentifierExpression = $__79.createIdentifierExpression,
+      createIdentifierToken = $__79.createIdentifierToken,
+      createMemberExpression = $__79.createMemberExpression,
+      createNullLiteral = $__79.createNullLiteral,
+      createNumberLiteral = $__79.createNumberLiteral,
+      createParenExpression = $__79.createParenExpression,
+      createSetAccessor = $__79.createSetAccessor,
+      createStringLiteral = $__79.createStringLiteral,
+      createVoid0 = $__79.createVoid0;
+  var NOT_FOUND = {};
+  var PREFIX = '$__placeholder__';
+  var cache = new ArrayMap();
+  function parseExpression(sourceLiterals) {
+    for (var values = [],
+        $__75 = 1; $__75 < arguments.length; $__75++)
+      values[$__75 - 1] = arguments[$__75];
+    return parse(sourceLiterals, values, (function() {
+      return new PlaceholderParser().parseExpression(sourceLiterals);
+    }));
+  }
+  function parseStatement(sourceLiterals) {
+    for (var values = [],
+        $__76 = 1; $__76 < arguments.length; $__76++)
+      values[$__76 - 1] = arguments[$__76];
+    return parse(sourceLiterals, values, (function() {
+      return new PlaceholderParser().parseStatement(sourceLiterals);
+    }));
+  }
+  function parseStatements(sourceLiterals) {
+    for (var values = [],
+        $__77 = 1; $__77 < arguments.length; $__77++)
+      values[$__77 - 1] = arguments[$__77];
+    return parse(sourceLiterals, values, (function() {
+      return new PlaceholderParser().parseStatements(sourceLiterals);
+    }));
+  }
+  function parsePropertyDefinition(sourceLiterals) {
+    for (var values = [],
+        $__78 = 1; $__78 < arguments.length; $__78++)
+      values[$__78 - 1] = arguments[$__78];
+    return parse(sourceLiterals, values, (function() {
+      return new PlaceholderParser().parsePropertyDefinition(sourceLiterals);
+    }));
+  }
+  function parse(sourceLiterals, values, doParse) {
+    var tree = cache.get(sourceLiterals);
+    if (!tree) {
+      tree = doParse();
+      cache.set(sourceLiterals, tree);
+    }
+    if (!values.length)
+      return tree;
+    if (tree instanceof ParseTree)
+      return new PlaceholderTransformer(values).transformAny(tree);
+    return new PlaceholderTransformer(values).transformList(tree);
+  }
+  var counter = 0;
+  var PlaceholderParser = function PlaceholderParser() {};
+  ($traceurRuntime.createClass)(PlaceholderParser, {
+    parseExpression: function(sourceLiterals) {
+      return this.parse_(sourceLiterals, (function(p) {
+        return p.parseExpression();
+      }));
+    },
+    parseStatement: function(sourceLiterals) {
+      return this.parse_(sourceLiterals, (function(p) {
+        return p.parseStatement();
+      }));
+    },
+    parseStatements: function(sourceLiterals) {
+      return this.parse_(sourceLiterals, (function(p) {
+        return p.parseStatements();
+      }));
+    },
+    parsePropertyDefinition: function(sourceLiterals) {
+      return this.parse_(sourceLiterals, (function(p) {
+        return p.parsePropertyDefinition();
+      }));
+    },
+    parse_: function(sourceLiterals, doParse) {
+      var source = sourceLiterals[0];
+      for (var i = 1; i < sourceLiterals.length; i++) {
+        source += PREFIX + (i - 1) + sourceLiterals[i];
+      }
+      var file = new SourceFile('@traceur/generated/TemplateParser/' + counter++, source);
+      var errorReporter = new MutedErrorReporter();
+      var parser = new Parser(file, errorReporter);
+      var tree = doParse(parser);
+      if (errorReporter.hadError() || !tree || !parser.isAtEnd())
+        throw new Error(("Internal error trying to parse:\n\n" + source));
+      return tree;
+    }
+  }, {});
+  function convertValueToExpression(value) {
+    if (value instanceof ParseTree)
+      return value;
+    if (value instanceof IdentifierToken)
+      return createIdentifierExpression(value);
+    if (value instanceof LiteralToken)
+      return new LiteralExpression(value.location, value);
+    if (Array.isArray(value)) {
+      if (value[0] instanceof ParseTree) {
+        if (value.length === 1)
+          return value[0];
+        if (value[0].isStatement())
+          return createBlock(value);
+        else
+          return createParenExpression(createCommaExpression(value));
+      }
+      return createArrayLiteralExpression(value.map(convertValueToExpression));
+    }
+    if (value === null)
+      return createNullLiteral();
+    if (value === undefined)
+      return createVoid0();
+    switch (typeof value) {
+      case 'string':
+        return createStringLiteral(value);
+      case 'boolean':
+        return createBooleanLiteral(value);
+      case 'number':
+        return createNumberLiteral(value);
+    }
+    throw new Error('Not implemented');
+  }
+  function convertValueToIdentifierToken(value) {
+    if (value instanceof IdentifierToken)
+      return value;
+    return createIdentifierToken(value);
+  }
+  var PlaceholderTransformer = function PlaceholderTransformer(values) {
+    $traceurRuntime.superCall(this, $PlaceholderTransformer.prototype, "constructor", []);
+    this.values = values;
+  };
+  var $PlaceholderTransformer = PlaceholderTransformer;
+  ($traceurRuntime.createClass)(PlaceholderTransformer, {
+    getValueAt: function(index) {
+      return this.values[index];
+    },
+    getValue_: function(str) {
+      if (str.indexOf(PREFIX) !== 0)
+        return NOT_FOUND;
+      return this.getValueAt(Number(str.slice(PREFIX.length)));
+    },
+    transformIdentifierExpression: function(tree) {
+      var value = this.getValue_(tree.identifierToken.value);
+      if (value === NOT_FOUND)
+        return tree;
+      return convertValueToExpression(value);
+    },
+    transformBindingIdentifier: function(tree) {
+      var value = this.getValue_(tree.identifierToken.value);
+      if (value === NOT_FOUND)
+        return tree;
+      return createBindingIdentifier(value);
+    },
+    transformExpressionStatement: function(tree) {
+      if (tree.expression.type === IDENTIFIER_EXPRESSION) {
+        var transformedExpression = this.transformIdentifierExpression(tree.expression);
+        if (transformedExpression === tree.expression)
+          return tree;
+        if (transformedExpression.isStatement())
+          return transformedExpression;
+        return createExpressionStatement(transformedExpression);
+      }
+      return $traceurRuntime.superCall(this, $PlaceholderTransformer.prototype, "transformExpressionStatement", [tree]);
+    },
+    transformBlock: function(tree) {
+      if (tree.statements.length === 1 && tree.statements[0].type === EXPRESSION_STATEMENT) {
+        var transformedStatement = this.transformExpressionStatement(tree.statements[0]);
+        if (transformedStatement === tree.statements[0])
+          return tree;
+        if (transformedStatement.type === BLOCK)
+          return transformedStatement;
+      }
+      return $traceurRuntime.superCall(this, $PlaceholderTransformer.prototype, "transformBlock", [tree]);
+    },
+    transformFunctionBody: function(tree) {
+      if (tree.statements.length === 1 && tree.statements[0].type === EXPRESSION_STATEMENT) {
+        var transformedStatement = this.transformExpressionStatement(tree.statements[0]);
+        if (transformedStatement === tree.statements[0])
+          return tree;
+        if (transformedStatement.type === BLOCK)
+          return createFunctionBody(transformedStatement.statements);
+      }
+      return $traceurRuntime.superCall(this, $PlaceholderTransformer.prototype, "transformFunctionBody", [tree]);
+    },
+    transformMemberExpression: function(tree) {
+      var value = this.getValue_(tree.memberName.value);
+      if (value === NOT_FOUND)
+        return $traceurRuntime.superCall(this, $PlaceholderTransformer.prototype, "transformMemberExpression", [tree]);
+      var operand = this.transformAny(tree.operand);
+      return createMemberExpression(operand, value);
+    },
+    transformLiteralPropertyName: function(tree) {
+      if (tree.literalToken.type === IDENTIFIER) {
+        var value = this.getValue_(tree.literalToken.value);
+        if (value !== NOT_FOUND) {
+          return new LiteralPropertyName(null, convertValueToIdentifierToken(value));
+        }
+      }
+      return $traceurRuntime.superCall(this, $PlaceholderTransformer.prototype, "transformLiteralPropertyName", [tree]);
+    },
+    transformArgumentList: function(tree) {
+      if (tree.args.length === 1 && tree.args[0].type === IDENTIFIER_EXPRESSION) {
+        var arg0 = this.transformAny(tree.args[0]);
+        if (arg0 === tree.args[0])
+          return tree;
+        if (arg0.type === ARGUMENT_LIST)
+          return arg0;
+      }
+      return $traceurRuntime.superCall(this, $PlaceholderTransformer.prototype, "transformArgumentList", [tree]);
+    }
+  }, {}, ParseTreeTransformer);
+  return {
+    get parseExpression() {
+      return parseExpression;
+    },
+    get parseStatement() {
+      return parseStatement;
+    },
+    get parseStatements() {
+      return parseStatements;
+    },
+    get parsePropertyDefinition() {
+      return parsePropertyDefinition;
+    },
+    get PlaceholderParser() {
+      return PlaceholderParser;
+    },
+    get PlaceholderTransformer() {
+      return PlaceholderTransformer;
+    }
+  };
+});
+System.register("traceur@0.0.32/src/codegeneration/PrependStatements", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/PrependStatements";
+  var $__81 = System.get("traceur@0.0.32/src/syntax/trees/ParseTreeType"),
+      EXPRESSION_STATEMENT = $__81.EXPRESSION_STATEMENT,
+      LITERAL_EXPRESSION = $__81.LITERAL_EXPRESSION;
+  var STRING = System.get("traceur@0.0.32/src/syntax/TokenType").STRING;
+  function isStringExpressionStatement(tree) {
+    return tree.type === EXPRESSION_STATEMENT && tree.expression.type === LITERAL_EXPRESSION && tree.expression.literalToken.type === STRING;
+  }
+  function prependStatements(statements) {
+    for (var statementsToPrepend = [],
+        $__80 = 1; $__80 < arguments.length; $__80++)
+      statementsToPrepend[$__80 - 1] = arguments[$__80];
+    if (!statements.length)
+      return statementsToPrepend;
+    if (!statementsToPrepend.length)
+      return statements;
+    var transformed = [];
+    var inProlog = true;
+    statements.forEach((function(statement) {
+      var $__82;
+      if (inProlog && !isStringExpressionStatement(statement)) {
+        ($__82 = transformed).push.apply($__82, $traceurRuntime.toObject(statementsToPrepend));
+        inProlog = false;
+      }
+      transformed.push(statement);
+    }));
+    return transformed;
+  }
+  return {get prependStatements() {
+      return prependStatements;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/TempVarTransformer", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/TempVarTransformer";
+  var ParseTreeTransformer = System.get("traceur@0.0.32/src/codegeneration/ParseTreeTransformer").ParseTreeTransformer;
+  var $__84 = System.get("traceur@0.0.32/src/syntax/trees/ParseTrees"),
+      Module = $__84.Module,
+      Script = $__84.Script;
+  var ARGUMENTS = System.get("traceur@0.0.32/src/syntax/PredefinedName").ARGUMENTS;
+  var VAR = System.get("traceur@0.0.32/src/syntax/TokenType").VAR;
+  var $__84 = System.get("traceur@0.0.32/src/codegeneration/ParseTreeFactory"),
+      createFunctionBody = $__84.createFunctionBody,
+      createThisExpression = $__84.createThisExpression,
+      createIdentifierExpression = $__84.createIdentifierExpression,
+      createVariableDeclaration = $__84.createVariableDeclaration,
+      createVariableDeclarationList = $__84.createVariableDeclarationList,
+      createVariableStatement = $__84.createVariableStatement;
+  var prependStatements = System.get("traceur@0.0.32/src/codegeneration/PrependStatements").prependStatements;
+  function getVars(self) {
+    var vars = self.tempVarStack_[self.tempVarStack_.length - 1];
+    if (!vars)
+      throw new Error('Invalid use of addTempVar');
+    return vars;
+  }
+  var TempVarStatement = function TempVarStatement(name, initialiser) {
+    this.name = name;
+    this.initialiser = initialiser;
+  };
+  ($traceurRuntime.createClass)(TempVarStatement, {}, {});
+  var TempScope = function TempScope() {
+    this.thisName = null;
+    this.argumentName = null;
+    this.identifiers = [];
+  };
+  ($traceurRuntime.createClass)(TempScope, {
+    push: function(identifier) {
+      this.identifiers.push(identifier);
+    },
+    pop: function() {
+      return this.identifiers.pop();
+    },
+    release: function(obj) {
+      for (var i = this.identifiers.length - 1; i >= 0; i--) {
+        obj.release_(this.identifiers[i]);
+      }
+    }
+  }, {});
+  var TempVarTransformer = function TempVarTransformer(identifierGenerator) {
+    $traceurRuntime.superCall(this, $TempVarTransformer.prototype, "constructor", []);
+    this.identifierGenerator = identifierGenerator;
+    this.tempVarStack_ = [[]];
+    this.tempScopeStack_ = [new TempScope()];
+    this.namePool_ = [];
+  };
+  var $TempVarTransformer = TempVarTransformer;
+  ($traceurRuntime.createClass)(TempVarTransformer, {
+    transformStatements_: function(statements) {
+      this.tempVarStack_.push([]);
+      var transformedStatements = this.transformList(statements);
+      var vars = this.tempVarStack_.pop();
+      if (!vars.length)
+        return transformedStatements;
+      var seenNames = Object.create(null);
+      vars = vars.filter((function(tempVarStatement) {
+        var $__84 = tempVarStatement,
+            name = $__84.name,
+            initialiser = $__84.initialiser;
+        if (name in seenNames) {
+          if (seenNames[name].initialiser || initialiser)
+            throw new Error('Invalid use of TempVarTransformer');
+          return false;
+        }
+        seenNames[name] = tempVarStatement;
+        return true;
+      }));
+      var variableStatement = createVariableStatement(createVariableDeclarationList(VAR, vars.map((function($__84) {
+        var name = $__84.name,
+            initialiser = $__84.initialiser;
+        return createVariableDeclaration(name, initialiser);
+      }))));
+      return prependStatements(transformedStatements, variableStatement);
+    },
+    transformScript: function(tree) {
+      var scriptItemList = this.transformStatements_(tree.scriptItemList);
+      if (scriptItemList == tree.scriptItemList) {
+        return tree;
+      }
+      return new Script(tree.location, scriptItemList, tree.moduleName);
+    },
+    transformModule: function(tree) {
+      var scriptItemList = this.transformStatements_(tree.scriptItemList);
+      if (scriptItemList == tree.scriptItemList) {
+        return tree;
+      }
+      return new Module(tree.location, scriptItemList, tree.moduleName);
+    },
+    transformFunctionBody: function(tree) {
+      this.pushTempVarState();
+      var statements = this.transformStatements_(tree.statements);
+      this.popTempVarState();
+      if (statements == tree.statements)
+        return tree;
+      return createFunctionBody(statements);
+    },
+    getTempIdentifier: function() {
+      var name = this.namePool_.length ? this.namePool_.pop() : this.identifierGenerator.generateUniqueIdentifier();
+      this.tempScopeStack_[this.tempScopeStack_.length - 1].push(name);
+      return name;
+    },
+    addTempVar: function() {
+      var initialiser = arguments[0] !== (void 0) ? arguments[0] : null;
+      var vars = getVars(this);
+      var uid = this.getTempIdentifier();
+      vars.push(new TempVarStatement(uid, initialiser));
+      return uid;
+    },
+    addTempVarForThis: function() {
+      var tempScope = this.tempScopeStack_[this.tempScopeStack_.length - 1];
+      return tempScope.thisName || (tempScope.thisName = this.addTempVar(createThisExpression()));
+    },
+    addTempVarForArguments: function() {
+      var tempScope = this.tempScopeStack_[this.tempScopeStack_.length - 1];
+      return tempScope.argumentName || (tempScope.argumentName = this.addTempVar(createIdentifierExpression(ARGUMENTS)));
+    },
+    pushTempVarState: function() {
+      this.tempScopeStack_.push(new TempScope());
+    },
+    popTempVarState: function() {
+      this.tempScopeStack_.pop().release(this);
+    },
+    release_: function(name) {
+      this.namePool_.push(name);
+    }
+  }, {}, ParseTreeTransformer);
+  return {get TempVarTransformer() {
+      return TempVarTransformer;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/module/ModuleSymbol", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/module/ModuleSymbol";
+  var assert = System.get("traceur@0.0.32/src/util/assert").assert;
+  var ExportsList = function ExportsList(normalizedName) {
+    this.exports_ = Object.create(null);
+    if (normalizedName !== null)
+      this.normalizedName = normalizedName.replace(/\\/g, '/');
+    else
+      this.normalizedName = null;
+  };
+  ($traceurRuntime.createClass)(ExportsList, {
+    addExport: function(name, tree) {
+      assert(!this.exports_[name]);
+      this.exports_[name] = tree;
+    },
+    getExport: function(name) {
+      return this.exports_[name];
+    },
+    getExports: function() {
+      return Object.keys(this.exports_);
+    }
+  }, {});
+  var ModuleDescription = function ModuleDescription(normalizedName, module) {
+    var $__85 = this;
+    $traceurRuntime.superCall(this, $ModuleDescription.prototype, "constructor", [normalizedName]);
+    Object.getOwnPropertyNames(module).forEach((function(name) {
+      $__85.addExport(name, true);
+    }));
+  };
+  var $ModuleDescription = ModuleDescription;
+  ($traceurRuntime.createClass)(ModuleDescription, {}, {}, ExportsList);
+  var ModuleSymbol = function ModuleSymbol(tree, normalizedName) {
+    $traceurRuntime.superCall(this, $ModuleSymbol.prototype, "constructor", [normalizedName]);
+    this.tree = tree;
+    this.imports_ = Object.create(null);
+  };
+  var $ModuleSymbol = ModuleSymbol;
+  ($traceurRuntime.createClass)(ModuleSymbol, {
+    addImport: function(name, tree) {
+      assert(!this.imports_[name]);
+      this.imports_[name] = tree;
+    },
+    getImport: function(name) {
+      return this.imports_[name];
+    }
+  }, {}, ExportsList);
+  return {
+    get ModuleDescription() {
+      return ModuleDescription;
+    },
+    get ModuleSymbol() {
+      return ModuleSymbol;
+    }
+  };
+});
+System.register("traceur@0.0.32/src/codegeneration/module/ModuleVisitor", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/module/ModuleVisitor";
+  var ModuleDescription = System.get("traceur@0.0.32/src/codegeneration/module/ModuleSymbol").ModuleDescription;
+  var ParseTree = System.get("traceur@0.0.32/src/syntax/trees/ParseTree").ParseTree;
+  var ParseTreeVisitor = System.get("traceur@0.0.32/src/syntax/ParseTreeVisitor").ParseTreeVisitor;
+  var $__89 = System.get("traceur@0.0.32/src/syntax/trees/ParseTreeType"),
+      MODULE_DECLARATION = $__89.MODULE_DECLARATION,
+      EXPORT_DECLARATION = $__89.EXPORT_DECLARATION,
+      IMPORT_DECLARATION = $__89.IMPORT_DECLARATION;
+  var ModuleVisitor = function ModuleVisitor(reporter, loader, moduleSymbol) {
+    this.reporter = reporter;
+    this.loader_ = loader;
+    this.moduleSymbol = moduleSymbol;
+  };
+  ($traceurRuntime.createClass)(ModuleVisitor, {
+    getModuleDescriptionFromCodeUnit_: function(name, codeUnitToModuleInfo) {
+      var referrer = this.moduleSymbol.normalizedName;
+      var codeUnit = this.loader_.getCodeUnitForModuleSpecifier(name, referrer);
+      var moduleDescription = codeUnitToModuleInfo(codeUnit);
+      if (!moduleDescription) {
+        var msg = (name + " is not a module, required by " + referrer);
+        this.reportError(codeUnit.metadata.tree, msg);
+        return null;
+      }
+      return moduleDescription;
+    },
+    getModuleSymbolForModuleSpecifier: function(name) {
+      return this.getModuleDescriptionFromCodeUnit_(name, (function(codeUnit) {
+        return codeUnit.metadata.moduleSymbol;
+      }));
+    },
+    getModuleDescriptionForModuleSpecifier: function(name) {
+      return this.getModuleDescriptionFromCodeUnit_(name, (function(codeUnit) {
+        var moduleDescription = codeUnit.metadata.moduleSymbol;
+        if (!moduleDescription && codeUnit.result) {
+          moduleDescription = new ModuleDescription(codeUnit.normalizedName, codeUnit.result);
+        }
+        return moduleDescription;
+      }));
+    },
+    visitFunctionDeclaration: function(tree) {},
+    visitFunctionExpression: function(tree) {},
+    visitFunctionBody: function(tree) {},
+    visitBlock: function(tree) {},
+    visitClassDeclaration: function(tree) {},
+    visitClassExpression: function(tree) {},
+    visitModuleElement_: function(element) {
+      switch (element.type) {
+        case MODULE_DECLARATION:
+        case EXPORT_DECLARATION:
+        case IMPORT_DECLARATION:
+          this.visitAny(element);
+      }
+    },
+    visitScript: function(tree) {
+      tree.scriptItemList.forEach(this.visitModuleElement_, this);
+    },
+    visitModule: function(tree) {
+      tree.scriptItemList.forEach(this.visitModuleElement_, this);
+    },
+    reportError: function(tree, message) {
+      this.reporter.reportError(tree.location.start, message);
+    }
+  }, {}, ParseTreeVisitor);
+  return {get ModuleVisitor() {
+      return ModuleVisitor;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/module/ExportVisitor", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/module/ExportVisitor";
+  var ModuleVisitor = System.get("traceur@0.0.32/src/codegeneration/module/ModuleVisitor").ModuleVisitor;
+  var assert = System.get("traceur@0.0.32/src/util/assert").assert;
+  var ExportVisitor = function ExportVisitor(reporter, loaderHooks, moduleSymbol) {
+    $traceurRuntime.superCall(this, $ExportVisitor.prototype, "constructor", [reporter, loaderHooks, moduleSymbol]);
+    this.inExport_ = false;
+    this.moduleSpecifier = null;
+  };
+  var $ExportVisitor = ExportVisitor;
+  ($traceurRuntime.createClass)(ExportVisitor, {
+    addExport_: function(name, tree) {
+      assert(typeof name == 'string');
+      if (this.inExport_)
+        this.addExport(name, tree);
+    },
+    addExport: function(name, tree) {
+      var moduleSymbol = this.moduleSymbol;
+      var existingExport = moduleSymbol.getExport(name);
+      if (existingExport) {
+        this.reportError(tree, ("Duplicate export. '" + name + "' was previously ") + ("exported at " + existingExport.location.start));
+      } else {
+        moduleSymbol.addExport(name, tree);
+      }
+    },
+    visitClassDeclaration: function(tree) {
+      this.addExport_(tree.name.identifierToken.value, tree);
+    },
+    visitExportDeclaration: function(tree) {
+      this.inExport_ = true;
+      this.visitAny(tree.declaration);
+      this.inExport_ = false;
+    },
+    visitNamedExport: function(tree) {
+      this.moduleSpecifier = tree.moduleSpecifier;
+      this.visitAny(tree.specifierSet);
+      this.moduleSpecifier = null;
+    },
+    visitExportDefault: function(tree) {
+      this.addExport_('default', tree);
+    },
+    visitExportSpecifier: function(tree) {
+      this.addExport_((tree.rhs || tree.lhs).value, tree);
+    },
+    visitExportStar: function(tree) {
+      var $__90 = this;
+      var name = this.moduleSpecifier.token.processedValue;
+      var moduleDescription = this.getModuleDescriptionForModuleSpecifier(name);
+      if (moduleDescription) {
+        moduleDescription.getExports().forEach((function(name) {
+          $__90.addExport(name, tree);
+        }));
+      }
+    },
+    visitFunctionDeclaration: function(tree) {
+      this.addExport_(tree.name.identifierToken.value, tree);
+    },
+    visitModuleDeclaration: function(tree) {
+      this.addExport_(tree.identifier.value, tree);
+    },
+    visitVariableDeclaration: function(tree) {
+      this.addExport_(tree.lvalue.identifierToken.value, tree);
+    }
+  }, {}, ModuleVisitor);
+  return {get ExportVisitor() {
+      return ExportVisitor;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/module/DirectExportVisitor", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/module/DirectExportVisitor";
+  var ExportVisitor = System.get("traceur@0.0.32/src/codegeneration/module/ExportVisitor").ExportVisitor;
+  var DirectExportVisitor = function DirectExportVisitor() {
+    $traceurRuntime.superCall(this, $DirectExportVisitor.prototype, "constructor", [null, null, null]);
+    this.namedExports = [];
+    this.starExports = [];
+  };
+  var $DirectExportVisitor = DirectExportVisitor;
+  ($traceurRuntime.createClass)(DirectExportVisitor, {
+    addExport: function(name, tree) {
+      this.namedExports.push({
+        name: name,
+        tree: tree,
+        moduleSpecifier: this.moduleSpecifier
+      });
+    },
+    visitExportStar: function(tree) {
+      this.starExports.push(this.moduleSpecifier);
+    },
+    hasExports: function() {
+      return this.namedExports.length != 0 || this.starExports.length != 0;
+    }
+  }, {}, ExportVisitor);
+  return {get DirectExportVisitor() {
+      return DirectExportVisitor;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/ModuleTransformer", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/ModuleTransformer";
+  var $__95 = Object.freeze(Object.defineProperties(["var __moduleName = ", ";"], {raw: {value: Object.freeze(["var __moduleName = ", ";"])}})),
+      $__96 = Object.freeze(Object.defineProperties(["function() {\n      ", "\n    }"], {raw: {value: Object.freeze(["function() {\n      ", "\n    }"])}})),
+      $__97 = Object.freeze(Object.defineProperties(["$traceurRuntime.ModuleStore.getAnonymousModule(\n              ", ");"], {raw: {value: Object.freeze(["$traceurRuntime.ModuleStore.getAnonymousModule(\n              ", ");"])}})),
+      $__98 = Object.freeze(Object.defineProperties(["System.register(", ", [], ", ");"], {raw: {value: Object.freeze(["System.register(", ", [], ", ");"])}})),
+      $__99 = Object.freeze(Object.defineProperties(["get ", "() { return ", "; }"], {raw: {value: Object.freeze(["get ", "() { return ", "; }"])}})),
+      $__100 = Object.freeze(Object.defineProperties(["return $traceurRuntime.exportStar(", ")"], {raw: {value: Object.freeze(["return $traceurRuntime.exportStar(", ")"])}})),
+      $__101 = Object.freeze(Object.defineProperties(["return ", ""], {raw: {value: Object.freeze(["return ", ""])}})),
+      $__102 = Object.freeze(Object.defineProperties(["var $__default = ", ""], {raw: {value: Object.freeze(["var $__default = ", ""])}})),
+      $__103 = Object.freeze(Object.defineProperties(["System.get(", ")"], {raw: {value: Object.freeze(["System.get(", ")"])}}));
+  var $__106 = System.get("traceur@0.0.32/src/syntax/trees/ParseTrees"),
+      BindingElement = $__106.BindingElement,
+      BindingIdentifier = $__106.BindingIdentifier,
+      EmptyStatement = $__106.EmptyStatement,
+      LiteralPropertyName = $__106.LiteralPropertyName,
+      ObjectPattern = $__106.ObjectPattern,
+      ObjectPatternField = $__106.ObjectPatternField,
+      Script = $__106.Script;
+  var DirectExportVisitor = System.get("traceur@0.0.32/src/codegeneration/module/DirectExportVisitor").DirectExportVisitor;
+  var TempVarTransformer = System.get("traceur@0.0.32/src/codegeneration/TempVarTransformer").TempVarTransformer;
+  var $__106 = System.get("traceur@0.0.32/src/syntax/trees/ParseTreeType"),
+      EXPORT_DEFAULT = $__106.EXPORT_DEFAULT,
+      EXPORT_SPECIFIER = $__106.EXPORT_SPECIFIER;
+  var VAR = System.get("traceur@0.0.32/src/syntax/TokenType").VAR;
+  var assert = System.get("traceur@0.0.32/src/util/assert").assert;
+  var $__106 = System.get("traceur@0.0.32/src/codegeneration/ParseTreeFactory"),
+      createArgumentList = $__106.createArgumentList,
+      createBindingIdentifier = $__106.createBindingIdentifier,
+      createExpressionStatement = $__106.createExpressionStatement,
+      createIdentifierExpression = $__106.createIdentifierExpression,
+      createIdentifierToken = $__106.createIdentifierToken,
+      createMemberExpression = $__106.createMemberExpression,
+      createObjectLiteralExpression = $__106.createObjectLiteralExpression,
+      createUseStrictDirective = $__106.createUseStrictDirective,
+      createVariableStatement = $__106.createVariableStatement;
+  var $__106 = System.get("traceur@0.0.32/src/codegeneration/PlaceholderParser"),
+      parseExpression = $__106.parseExpression,
+      parsePropertyDefinition = $__106.parsePropertyDefinition,
+      parseStatement = $__106.parseStatement,
+      parseStatements = $__106.parseStatements;
+  var ModuleTransformer = function ModuleTransformer(identifierGenerator) {
+    $traceurRuntime.superCall(this, $ModuleTransformer.prototype, "constructor", [identifierGenerator]);
+    this.exportVisitor_ = new DirectExportVisitor();
+    this.moduleSpecifierKind_ = null;
+    this.moduleName = null;
+  };
+  var $ModuleTransformer = ModuleTransformer;
+  ($traceurRuntime.createClass)(ModuleTransformer, {
+    getTempVarNameForModuleName: function(moduleName) {
+      return '$__' + moduleName.replace(/[^a-zA-Z0-9$]/g, function(c) {
+        return '_' + c.charCodeAt(0) + '_';
+      }) + '__';
+    },
+    getTempVarNameForModuleSpecifier: function(moduleSpecifier) {
+      var normalizedName = System.normalize(moduleSpecifier.token.processedValue, this.moduleName);
+      return this.getTempVarNameForModuleName(normalizedName);
+    },
+    transformScript: function(tree) {
+      this.moduleName = tree.moduleName;
+      return $traceurRuntime.superCall(this, $ModuleTransformer.prototype, "transformScript", [tree]);
+    },
+    transformModule: function(tree) {
+      this.moduleName = tree.moduleName;
+      this.pushTempVarState();
+      var statements = $traceurRuntime.spread(this.transformList(tree.scriptItemList), [this.createExportStatement()]);
+      this.popTempVarState();
+      statements = this.wrapModule(this.moduleProlog().concat(statements));
+      return new Script(tree.location, statements);
+    },
+    moduleProlog: function() {
+      var statements = [createUseStrictDirective()];
+      if (this.moduleName)
+        statements.push(parseStatement($__95, this.moduleName));
+      return statements;
+    },
+    wrapModule: function(statements) {
+      var functionExpression = parseExpression($__96, statements);
+      if (this.moduleName === null) {
+        return parseStatements($__97, functionExpression);
+      }
+      return parseStatements($__98, this.moduleName, functionExpression);
+    },
+    getGetterExport: function($__106) {
+      var name = $__106.name,
+          tree = $__106.tree,
+          moduleSpecifier = $__106.moduleSpecifier;
+      var returnExpression;
+      switch (tree.type) {
+        case EXPORT_DEFAULT:
+          returnExpression = createIdentifierExpression('$__default');
+          break;
+        case EXPORT_SPECIFIER:
+          if (moduleSpecifier) {
+            var idName = this.getTempVarNameForModuleSpecifier(moduleSpecifier);
+            returnExpression = createMemberExpression(idName, tree.lhs);
+          } else {
+            returnExpression = createIdentifierExpression(tree.lhs);
+          }
+          break;
+        default:
+          returnExpression = createIdentifierExpression(name);
+          break;
+      }
+      return parsePropertyDefinition($__99, name, returnExpression);
+    },
+    getExportProperties: function() {
+      var $__104 = this;
+      return this.exportVisitor_.namedExports.map((function(exp) {
+        return $__104.getGetterExport(exp);
+      }));
+    },
+    createExportStatement: function() {
+      var $__104 = this;
+      var object = createObjectLiteralExpression(this.getExportProperties());
+      if (this.exportVisitor_.starExports.length) {
+        var starExports = this.exportVisitor_.starExports;
+        var starIdents = starExports.map((function(moduleSpecifier) {
+          return createIdentifierExpression($__104.getTempVarNameForModuleSpecifier(moduleSpecifier));
+        }));
+        var args = createArgumentList.apply(null, $traceurRuntime.spread([object], starIdents));
+        return parseStatement($__100, args);
+      }
+      return parseStatement($__101, object);
+    },
+    hasExports: function() {
+      return this.exportVisitor_.hasExports();
+    },
+    transformExportDeclaration: function(tree) {
+      this.exportVisitor_.visitAny(tree);
+      return this.transformAny(tree.declaration);
+    },
+    transformExportDefault: function(tree) {
+      return parseStatement($__102, tree.expression);
+    },
+    transformNamedExport: function(tree) {
+      var moduleSpecifier = tree.moduleSpecifier;
+      if (moduleSpecifier) {
+        var expression = this.transformAny(moduleSpecifier);
+        var idName = this.getTempVarNameForModuleSpecifier(moduleSpecifier);
+        return createVariableStatement(VAR, idName, expression);
+      }
+      return new EmptyStatement(null);
+    },
+    transformModuleSpecifier: function(tree) {
+      assert(this.moduleName);
+      var name = tree.token.processedValue;
+      var normalizedName = System.normalize(name, this.moduleName);
+      return parseExpression($__103, normalizedName);
+    },
+    transformModuleDeclaration: function(tree) {
+      this.moduleSpecifierKind_ = 'module';
+      var initialiser = this.transformAny(tree.expression);
+      return createVariableStatement(VAR, tree.identifier, initialiser);
+    },
+    transformImportedBinding: function(tree) {
+      var bindingElement = new BindingElement(tree.location, tree.binding, null);
+      var name = new LiteralPropertyName(null, createIdentifierToken('default'));
+      return new ObjectPattern(null, [new ObjectPatternField(null, name, bindingElement)]);
+    },
+    transformImportDeclaration: function(tree) {
+      this.moduleSpecifierKind_ = 'import';
+      if (!tree.importClause)
+        return createExpressionStatement(this.transformAny(tree.moduleSpecifier));
+      var binding = this.transformAny(tree.importClause);
+      var initialiser = this.transformAny(tree.moduleSpecifier);
+      return createVariableStatement(VAR, binding, initialiser);
+    },
+    transformImportSpecifierSet: function(tree) {
+      var fields = this.transformList(tree.specifiers);
+      return new ObjectPattern(null, fields);
+    },
+    transformImportSpecifier: function(tree) {
+      if (tree.rhs) {
+        var binding = new BindingIdentifier(tree.location, tree.rhs);
+        var bindingElement = new BindingElement(tree.location, binding, null);
+        var name = new LiteralPropertyName(tree.lhs.location, tree.lhs);
+        return new ObjectPatternField(tree.location, name, bindingElement);
+      }
+      return new BindingElement(tree.location, createBindingIdentifier(tree.lhs), null);
+    }
+  }, {}, TempVarTransformer);
+  return {get ModuleTransformer() {
+      return ModuleTransformer;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/globalThis", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/globalThis";
+  var $__107 = Object.freeze(Object.defineProperties(["typeof global !== 'undefined' ? global : this"], {raw: {value: Object.freeze(["typeof global !== 'undefined' ? global : this"])}}));
+  var parseExpression = System.get("traceur@0.0.32/src/codegeneration/PlaceholderParser").parseExpression;
+  var expr;
+  function globalThis() {
+    if (!expr)
+      expr = parseExpression($__107);
+    return expr;
+  }
+  var $__default = globalThis;
+  return {get default() {
+      return $__default;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/FindVisitor", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/FindVisitor";
+  var ParseTreeVisitor = System.get("traceur@0.0.32/src/syntax/ParseTreeVisitor").ParseTreeVisitor;
+  var foundSentinel = {};
+  var FindVisitor = function FindVisitor(tree) {
+    var keepOnGoing = arguments[1];
+    this.found_ = false;
+    this.keepOnGoing_ = keepOnGoing;
+    try {
+      this.visitAny(tree);
+    } catch (ex) {
+      if (ex !== foundSentinel)
+        throw ex;
+    }
+  };
+  ($traceurRuntime.createClass)(FindVisitor, {
+    get found() {
+      return this.found_;
+    },
+    set found(v) {
+      if (v) {
+        this.found_ = true;
+        if (!this.keepOnGoing_)
+          throw foundSentinel;
+      }
+    }
+  }, {}, ParseTreeVisitor);
+  return {get FindVisitor() {
+      return FindVisitor;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/FindInFunctionScope", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/FindInFunctionScope";
+  var FindVisitor = System.get("traceur@0.0.32/src/codegeneration/FindVisitor").FindVisitor;
+  var FindInFunctionScope = function FindInFunctionScope() {
+    $traceurRuntime.defaultSuperCall(this, $FindInFunctionScope.prototype, arguments);
+  };
+  var $FindInFunctionScope = FindInFunctionScope;
+  ($traceurRuntime.createClass)(FindInFunctionScope, {
+    visitFunctionDeclaration: function(tree) {},
+    visitFunctionExpression: function(tree) {},
+    visitSetAccessor: function(tree) {},
+    visitGetAccessor: function(tree) {},
+    visitPropertyMethodAssignment: function(tree) {}
+  }, {}, FindVisitor);
+  return {get FindInFunctionScope() {
+      return FindInFunctionScope;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/scopeContainsThis", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/scopeContainsThis";
+  var FindInFunctionScope = System.get("traceur@0.0.32/src/codegeneration/FindInFunctionScope").FindInFunctionScope;
+  var FindThis = function FindThis() {
+    $traceurRuntime.defaultSuperCall(this, $FindThis.prototype, arguments);
+  };
+  var $FindThis = FindThis;
+  ($traceurRuntime.createClass)(FindThis, {visitThisExpression: function(tree) {
+      this.found = true;
+    }}, {}, FindInFunctionScope);
+  function scopeContainsThis(tree) {
+    var visitor = new FindThis(tree);
+    return visitor.found;
+  }
+  var $__default = scopeContainsThis;
+  return {get default() {
+      return $__default;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/AmdTransformer", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/AmdTransformer";
+  var $__115 = Object.freeze(Object.defineProperties(["__esModule: true"], {raw: {value: Object.freeze(["__esModule: true"])}})),
+      $__116 = Object.freeze(Object.defineProperties(["if (!", " || !", ".__esModule)\n            ", " = { 'default': ", " }"], {raw: {value: Object.freeze(["if (!", " || !", ".__esModule)\n            ", " = { 'default': ", " }"])}})),
+      $__117 = Object.freeze(Object.defineProperties(["function(", ") {\n      ", "\n    }"], {raw: {value: Object.freeze(["function(", ") {\n      ", "\n    }"])}})),
+      $__118 = Object.freeze(Object.defineProperties(["", ".bind(", ")"], {raw: {value: Object.freeze(["", ".bind(", ")"])}})),
+      $__119 = Object.freeze(Object.defineProperties(["define(", ", ", ");"], {raw: {value: Object.freeze(["define(", ", ", ");"])}}));
+  var ModuleTransformer = System.get("traceur@0.0.32/src/codegeneration/ModuleTransformer").ModuleTransformer;
+  var VAR = System.get("traceur@0.0.32/src/syntax/TokenType").VAR;
+  var $__121 = System.get("traceur@0.0.32/src/codegeneration/ParseTreeFactory"),
+      createBindingIdentifier = $__121.createBindingIdentifier,
+      createIdentifierExpression = $__121.createIdentifierExpression;
+  var globalThis = System.get("traceur@0.0.32/src/codegeneration/globalThis").default;
+  var $__121 = System.get("traceur@0.0.32/src/codegeneration/PlaceholderParser"),
+      parseExpression = $__121.parseExpression,
+      parseStatement = $__121.parseStatement,
+      parseStatements = $__121.parseStatements,
+      parsePropertyDefinition = $__121.parsePropertyDefinition;
+  var scopeContainsThis = System.get("traceur@0.0.32/src/codegeneration/scopeContainsThis").default;
+  var AmdTransformer = function AmdTransformer(identifierGenerator) {
+    $traceurRuntime.superCall(this, $AmdTransformer.prototype, "constructor", [identifierGenerator]);
+    this.dependencies = [];
+  };
+  var $AmdTransformer = AmdTransformer;
+  ($traceurRuntime.createClass)(AmdTransformer, {
+    getExportProperties: function() {
+      var properties = $traceurRuntime.superCall(this, $AmdTransformer.prototype, "getExportProperties", []);
+      if (this.exportVisitor_.hasExports())
+        properties.push(parsePropertyDefinition($__115));
+      return properties;
+    },
+    moduleProlog: function() {
+      var locals = this.dependencies.map((function(dep) {
+        var local = createIdentifierExpression(dep.local);
+        return parseStatement($__116, local, local, local, local);
+      }));
+      return $traceurRuntime.superCall(this, $AmdTransformer.prototype, "moduleProlog", []).concat(locals);
+    },
+    wrapModule: function(statements) {
+      var depPaths = this.dependencies.map((function(dep) {
+        return dep.path;
+      }));
+      var depLocals = this.dependencies.map((function(dep) {
+        return dep.local;
+      }));
+      var hasTopLevelThis = statements.some(scopeContainsThis);
+      var func = parseExpression($__117, depLocals, statements);
+      if (hasTopLevelThis)
+        func = parseExpression($__118, func, globalThis());
+      return parseStatements($__119, depPaths, func);
+    },
+    transformModuleSpecifier: function(tree) {
+      var localName = this.getTempIdentifier();
+      this.dependencies.push({
+        path: tree.token,
+        local: localName
+      });
+      return createBindingIdentifier(localName);
+    }
+  }, {}, ModuleTransformer);
+  return {get AmdTransformer() {
+      return AmdTransformer;
+    }};
+});
+System.register("traceur@0.0.32/src/staticsemantics/PropName", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/staticsemantics/PropName";
+  var $__122 = System.get("traceur@0.0.32/src/syntax/trees/ParseTreeType"),
+      COMPUTED_PROPERTY_NAME = $__122.COMPUTED_PROPERTY_NAME,
+      GET_ACCESSOR = $__122.GET_ACCESSOR,
+      LITERAL_PROPERTY_NAME = $__122.LITERAL_PROPERTY_NAME,
+      PROPERTY_METHOD_ASSIGNMENT = $__122.PROPERTY_METHOD_ASSIGNMENT,
+      PROPERTY_NAME_ASSIGNMENT = $__122.PROPERTY_NAME_ASSIGNMENT,
+      PROPERTY_NAME_SHORTHAND = $__122.PROPERTY_NAME_SHORTHAND,
+      SET_ACCESSOR = $__122.SET_ACCESSOR;
+  var IDENTIFIER = System.get("traceur@0.0.32/src/syntax/TokenType").IDENTIFIER;
+  function propName(tree) {
+    switch (tree.type) {
+      case LITERAL_PROPERTY_NAME:
+        var token = tree.literalToken;
+        if (token.isKeyword() || token.type === IDENTIFIER)
+          return token.toString();
+        return String(tree.literalToken.processedValue);
+      case COMPUTED_PROPERTY_NAME:
+        return '';
+      case PROPERTY_NAME_SHORTHAND:
+        return tree.name.toString();
+      case PROPERTY_METHOD_ASSIGNMENT:
+      case PROPERTY_NAME_ASSIGNMENT:
+      case GET_ACCESSOR:
+      case SET_ACCESSOR:
+        return propName(tree.name);
+    }
+  }
+  return {get propName() {
+      return propName;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/AnnotationsTransformer", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/AnnotationsTransformer";
+  var $__123 = Object.freeze(Object.defineProperties(["Object.getOwnPropertyDescriptor(", ")"], {raw: {value: Object.freeze(["Object.getOwnPropertyDescriptor(", ")"])}}));
+  var ParseTreeTransformer = System.get("traceur@0.0.32/src/codegeneration/ParseTreeTransformer").ParseTreeTransformer;
+  var CONSTRUCTOR = System.get("traceur@0.0.32/src/syntax/PredefinedName").CONSTRUCTOR;
+  var $__126 = System.get("traceur@0.0.32/src/syntax/TokenType"),
+      IDENTIFIER = $__126.IDENTIFIER,
+      STRING = $__126.STRING;
+  var $__126 = System.get("traceur@0.0.32/src/syntax/trees/ParseTrees"),
+      AnonBlock = $__126.AnonBlock,
+      ClassDeclaration = $__126.ClassDeclaration,
+      ExportDeclaration = $__126.ExportDeclaration,
+      FormalParameter = $__126.FormalParameter,
+      FunctionDeclaration = $__126.FunctionDeclaration,
+      GetAccessor = $__126.GetAccessor,
+      LiteralExpression = $__126.LiteralExpression,
+      PropertyMethodAssignment = $__126.PropertyMethodAssignment,
+      SetAccessor = $__126.SetAccessor;
+  var $__126 = System.get("traceur@0.0.32/src/syntax/trees/ParseTreeType"),
+      BINDING_IDENTIFIER = $__126.BINDING_IDENTIFIER,
+      IDENTIFIER_EXPRESSION = $__126.IDENTIFIER_EXPRESSION;
+  var propName = System.get("traceur@0.0.32/src/staticsemantics/PropName").propName;
+  var $__126 = System.get("traceur@0.0.32/src/codegeneration/ParseTreeFactory"),
+      createArgumentList = $__126.createArgumentList,
+      createArrayLiteralExpression = $__126.createArrayLiteralExpression,
+      createAssignmentStatement = $__126.createAssignmentStatement,
+      createIdentifierExpression = $__126.createIdentifierExpression,
+      createMemberExpression = $__126.createMemberExpression,
+      createNewExpression = $__126.createNewExpression,
+      createStatementList = $__126.createStatementList,
+      createStringLiteralToken = $__126.createStringLiteralToken;
+  var parseExpression = System.get("traceur@0.0.32/src/codegeneration/PlaceholderParser").parseExpression;
+  var AnnotationsScope = function AnnotationsScope() {
+    this.className = null;
+    this.isExport = false;
+    this.constructorParameters = [];
+    this.annotations = [];
+    this.metadata = [];
+  };
+  ($traceurRuntime.createClass)(AnnotationsScope, {get inClassScope() {
+      return this.className !== null;
+    }}, {});
+  var AnnotationsTransformer = function AnnotationsTransformer() {
+    this.stack_ = [new AnnotationsScope()];
+  };
+  var $AnnotationsTransformer = AnnotationsTransformer;
+  ($traceurRuntime.createClass)(AnnotationsTransformer, {
+    transformExportDeclaration: function(tree) {
+      var $__127;
+      var scope = this.pushAnnotationScope_();
+      scope.isExport = true;
+      ($__127 = scope.annotations).push.apply($__127, $traceurRuntime.toObject(tree.annotations));
+      var declaration = this.transformAny(tree.declaration);
+      if (declaration !== tree.declaration || tree.annotations.length > 0)
+        tree = new ExportDeclaration(tree.location, declaration, []);
+      return this.appendMetadata_(tree);
+    },
+    transformClassDeclaration: function(tree) {
+      var $__127;
+      var elementsChanged = false;
+      var exportAnnotations = this.scope.isExport ? this.scope.annotations : [];
+      var scope = this.pushAnnotationScope_();
+      scope.className = tree.name;
+      ($__127 = scope.annotations).push.apply($__127, $traceurRuntime.spread(exportAnnotations, tree.annotations));
+      tree = $traceurRuntime.superCall(this, $AnnotationsTransformer.prototype, "transformClassDeclaration", [tree]);
+      ($__127 = scope.metadata).unshift.apply($__127, $traceurRuntime.toObject(this.transformMetadata_(createIdentifierExpression(tree.name), scope.annotations, scope.constructorParameters)));
+      if (tree.annotations.length > 0) {
+        tree = new ClassDeclaration(tree.location, tree.name, tree.superClass, tree.elements, []);
+      }
+      return this.appendMetadata_(tree);
+    },
+    transformFunctionDeclaration: function(tree) {
+      var $__127;
+      var exportAnnotations = this.scope.isExport ? this.scope.annotations : [];
+      var scope = this.pushAnnotationScope_();
+      ($__127 = scope.annotations).push.apply($__127, $traceurRuntime.spread(exportAnnotations, tree.annotations));
+      ($__127 = scope.metadata).push.apply($__127, $traceurRuntime.toObject(this.transformMetadata_(createIdentifierExpression(tree.name), scope.annotations, tree.formalParameterList.parameters)));
+      tree = $traceurRuntime.superCall(this, $AnnotationsTransformer.prototype, "transformFunctionDeclaration", [tree]);
+      if (tree.annotations.length > 0) {
+        tree = new FunctionDeclaration(tree.location, tree.name, tree.isGenerator, tree.formalParameterList, tree.typeAnnotation, [], tree.functionBody);
+      }
+      return this.appendMetadata_(tree);
+    },
+    transformFormalParameter: function(tree) {
+      if (tree.annotations.length > 0) {
+        tree = new FormalParameter(tree.location, tree.parameter, tree.typeAnnotation, []);
+      }
+      return $traceurRuntime.superCall(this, $AnnotationsTransformer.prototype, "transformFormalParameter", [tree]);
+    },
+    transformGetAccessor: function(tree) {
+      var $__127;
+      if (!this.scope.inClassScope)
+        return $traceurRuntime.superCall(this, $AnnotationsTransformer.prototype, "transformGetAccessor", [tree]);
+      ($__127 = this.scope.metadata).push.apply($__127, $traceurRuntime.toObject(this.transformMetadata_(this.transformAccessor_(tree, this.scope.className, 'get'), tree.annotations, [])));
+      if (tree.annotations.length > 0) {
+        tree = new GetAccessor(tree.location, tree.isStatic, tree.name, tree.typeAnnotation, [], tree.body);
+      }
+      return $traceurRuntime.superCall(this, $AnnotationsTransformer.prototype, "transformGetAccessor", [tree]);
+    },
+    transformSetAccessor: function(tree) {
+      var $__127;
+      if (!this.scope.inClassScope)
+        return $traceurRuntime.superCall(this, $AnnotationsTransformer.prototype, "transformSetAccessor", [tree]);
+      ($__127 = this.scope.metadata).push.apply($__127, $traceurRuntime.toObject(this.transformMetadata_(this.transformAccessor_(tree, this.scope.className, 'set'), tree.annotations, [tree.parameter])));
+      var parameter = this.transformAny(tree.parameter);
+      if (parameter !== tree.parameter || tree.annotations.length > 0) {
+        tree = new SetAccessor(tree.location, tree.isStatic, tree.name, parameter, [], tree.body);
+      }
+      return $traceurRuntime.superCall(this, $AnnotationsTransformer.prototype, "transformSetAccessor", [tree]);
+    },
+    transformPropertyMethodAssignment: function(tree) {
+      var $__127;
+      if (!this.scope.inClassScope)
+        return $traceurRuntime.superCall(this, $AnnotationsTransformer.prototype, "transformPropertyMethodAssignment", [tree]);
+      if (!tree.isStatic && propName(tree) === CONSTRUCTOR) {
+        ($__127 = this.scope.annotations).push.apply($__127, $traceurRuntime.toObject(tree.annotations));
+        this.scope.constructorParameters = tree.formalParameterList.parameters;
+      } else {
+        ($__127 = this.scope.metadata).push.apply($__127, $traceurRuntime.toObject(this.transformMetadata_(this.transformPropertyMethod_(tree, this.scope.className), tree.annotations, tree.formalParameterList.parameters)));
+      }
+      var formalParameters = this.transformAny(tree.formalParameterList);
+      if (formalParameters !== tree.formalParameterList || tree.annotations.length > 0) {
+        tree = new PropertyMethodAssignment(tree.location, tree.isStatic, tree.isGenerator, tree.name, formalParameters, tree.typeAnnotation, [], tree.functionBody);
+      }
+      return $traceurRuntime.superCall(this, $AnnotationsTransformer.prototype, "transformPropertyMethodAssignment", [tree]);
+    },
+    appendMetadata_: function(tree) {
+      var $__127;
+      var metadata = this.stack_.pop().metadata;
+      if (metadata.length > 0) {
+        if (this.scope.isExport) {
+          ($__127 = this.scope.metadata).push.apply($__127, $traceurRuntime.toObject(metadata));
+        } else {
+          tree = new AnonBlock(null, $traceurRuntime.spread([tree], metadata));
+        }
+      }
+      return tree;
+    },
+    transformClassReference_: function(tree, className) {
+      var parent = createIdentifierExpression(className);
+      if (!tree.isStatic)
+        parent = createMemberExpression(parent, 'prototype');
+      return parent;
+    },
+    transformPropertyMethod_: function(tree, className) {
+      return createMemberExpression(this.transformClassReference_(tree, className), tree.name.literalToken);
+    },
+    transformAccessor_: function(tree, className, accessor) {
+      var args = createArgumentList([this.transformClassReference_(tree, className), this.createLiteralStringExpression_(tree.name)]);
+      var descriptor = parseExpression($__123, args);
+      return createMemberExpression(descriptor, accessor);
+    },
+    transformParameters_: function(parameters) {
+      var $__124 = this;
+      var hasParameterMetadata = false;
+      parameters = parameters.map((function(param) {
+        var $__127;
+        var metadata = [];
+        if (param.typeAnnotation)
+          metadata.push($__124.transformAny(param.typeAnnotation));
+        if (param.annotations && param.annotations.length > 0)
+          ($__127 = metadata).push.apply($__127, $traceurRuntime.toObject($__124.transformAnnotations_(param.annotations)));
+        if (metadata.length > 0) {
+          hasParameterMetadata = true;
+          return createArrayLiteralExpression(metadata);
+        }
+        return createArrayLiteralExpression([]);
+      }));
+      return hasParameterMetadata ? parameters : [];
+    },
+    transformAnnotations_: function(annotations) {
+      return annotations.map((function(annotation) {
+        return createNewExpression(annotation.name, annotation.args);
+      }));
+    },
+    transformMetadata_: function(target, annotations, parameters) {
+      var metadataStatements = [];
+      if (annotations !== null) {
+        annotations = this.transformAnnotations_(annotations);
+        if (annotations.length > 0) {
+          metadataStatements.push(createAssignmentStatement(createMemberExpression(target, 'annotations'), createArrayLiteralExpression(annotations)));
+        }
+      }
+      if (parameters !== null) {
+        parameters = this.transformParameters_(parameters);
+        if (parameters.length > 0) {
+          metadataStatements.push(createAssignmentStatement(createMemberExpression(target, 'parameters'), createArrayLiteralExpression(parameters)));
+        }
+      }
+      return metadataStatements;
+    },
+    createLiteralStringExpression_: function(tree) {
+      var token = tree.literalToken;
+      if (tree.literalToken.type !== STRING)
+        token = createStringLiteralToken(tree.literalToken.value);
+      return new LiteralExpression(null, token);
+    },
+    get scope() {
+      return this.stack_[this.stack_.length - 1];
+    },
+    pushAnnotationScope_: function() {
+      var scope = new AnnotationsScope();
+      this.stack_.push(scope);
+      return scope;
+    }
+  }, {}, ParseTreeTransformer);
+  return {get AnnotationsTransformer() {
+      return AnnotationsTransformer;
+    }};
+});
+System.register("traceur@0.0.32/src/semantics/VariableBinder", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/semantics/VariableBinder";
+  var $__129 = System.get("traceur@0.0.32/src/syntax/trees/ParseTreeType"),
+      ARRAY_PATTERN = $__129.ARRAY_PATTERN,
+      BINDING_ELEMENT = $__129.BINDING_ELEMENT,
+      BINDING_IDENTIFIER = $__129.BINDING_IDENTIFIER,
+      FORMAL_PARAMETER = $__129.FORMAL_PARAMETER,
+      OBJECT_PATTERN = $__129.OBJECT_PATTERN,
+      OBJECT_PATTERN_FIELD = $__129.OBJECT_PATTERN_FIELD,
+      PAREN_EXPRESSION = $__129.PAREN_EXPRESSION,
+      SPREAD_PATTERN_ELEMENT = $__129.SPREAD_PATTERN_ELEMENT;
+  var ParseTreeVisitor = System.get("traceur@0.0.32/src/syntax/ParseTreeVisitor").ParseTreeVisitor;
+  var VAR = System.get("traceur@0.0.32/src/syntax/TokenType").VAR;
+  var assert = System.get("traceur@0.0.32/src/util/assert").assert;
+  function variablesInBlock(tree, includeFunctionScope) {
+    var binder = new VariableBinder(includeFunctionScope, tree);
+    binder.visitAny(tree);
+    return binder.identifiers_;
+  }
+  ;
+  function variablesInFunction(tree) {
+    var binder = new VariableBinder(true, tree.functionBody);
+    binder.bindVariablesInFunction_(tree);
+    return binder.identifiers_;
+  }
+  ;
+  var VariableBinder = function VariableBinder(includeFunctionScope, scope) {
+    $traceurRuntime.superCall(this, $VariableBinder.prototype, "constructor", []);
+    this.includeFunctionScope_ = includeFunctionScope;
+    this.scope_ = scope || null;
+    this.block_ = null;
+    this.identifiers_ = Object.create(null);
+  };
+  var $VariableBinder = VariableBinder;
+  ($traceurRuntime.createClass)(VariableBinder, {
+    bindVariablesInFunction_: function(tree) {
+      var parameters = tree.formalParameterList.parameters;
+      for (var i = 0; i < parameters.length; i++) {
+        this.bindParameter_(parameters[i]);
+      }
+      this.visitAny(tree.functionBody);
+    },
+    visitBlock: function(tree) {
+      var parentBlock = this.block_;
+      this.block_ = tree;
+      this.visitList(tree.statements);
+      this.block_ = parentBlock;
+    },
+    visitFunctionDeclaration: function(tree) {
+      if (this.block_ == this.scope_)
+        this.bind_(tree.name.identifierToken);
+    },
+    visitFunctionExpression: function(tree) {},
+    visitVariableDeclarationList: function(tree) {
+      if ((tree.declarationType == VAR && this.includeFunctionScope_) || (tree.declarationType != VAR && this.block_ == this.scope_)) {
+        $traceurRuntime.superCall(this, $VariableBinder.prototype, "visitVariableDeclarationList", [tree]);
+      } else {
+        var decls = tree.declarations;
+        for (var i = 0; i < decls.length; i++) {
+          this.visitAny(decls[i].initialiser);
+        }
+      }
+    },
+    visitVariableDeclaration: function(tree) {
+      this.bindVariableDeclaration_(tree.lvalue);
+      $traceurRuntime.superCall(this, $VariableBinder.prototype, "visitVariableDeclaration", [tree]);
+    },
+    bind_: function(identifier) {
+      assert(typeof identifier.value == 'string');
+      this.identifiers_[identifier.value] = true;
+    },
+    bindParameter_: function(parameter) {
+      if (parameter.type === FORMAL_PARAMETER)
+        parameter = parameter.parameter;
+      if (parameter.isRestParameter()) {
+        this.bind_(parameter.identifier);
+      } else {
+        this.bindVariableDeclaration_(parameter.binding);
+      }
+    },
+    bindVariableDeclaration_: function(tree) {
+      switch (tree.type) {
+        case BINDING_ELEMENT:
+          this.bindVariableDeclaration_(tree.binding);
+          break;
+        case BINDING_IDENTIFIER:
+          this.bind_(tree.identifierToken);
+          break;
+        case ARRAY_PATTERN:
+          var elements = tree.elements;
+          for (var i = 0; i < elements.length; i++) {
+            this.bindVariableDeclaration_(elements[i]);
+          }
+          break;
+        case SPREAD_PATTERN_ELEMENT:
+          this.bindVariableDeclaration_(tree.lvalue);
+          break;
+        case OBJECT_PATTERN:
+          var fields = tree.fields;
+          for (var i = 0; i < fields.length; i++) {
+            this.bindVariableDeclaration_(fields[i]);
+          }
+          break;
+        case OBJECT_PATTERN_FIELD:
+          var field = tree;
+          if (field.element == null) {
+            this.bind_(field.name);
+          } else {
+            this.bindVariableDeclaration_(field.element);
+          }
+          break;
+        case PAREN_EXPRESSION:
+          this.bindVariableDeclaration_(tree.expression);
+          break;
+        default:
+          throw new Error('unreachable');
+      }
+    }
+  }, {}, ParseTreeVisitor);
+  return {
+    get variablesInBlock() {
+      return variablesInBlock;
+    },
+    get variablesInFunction() {
+      return variablesInFunction;
+    },
+    get VariableBinder() {
+      return VariableBinder;
+    }
+  };
+});
+System.register("traceur@0.0.32/src/codegeneration/AlphaRenamer", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/AlphaRenamer";
+  var $__131 = System.get("traceur@0.0.32/src/syntax/trees/ParseTrees"),
+      FunctionDeclaration = $__131.FunctionDeclaration,
+      FunctionExpression = $__131.FunctionExpression;
+  var ParseTreeTransformer = System.get("traceur@0.0.32/src/codegeneration/ParseTreeTransformer").ParseTreeTransformer;
+  var $__131 = System.get("traceur@0.0.32/src/syntax/PredefinedName"),
+      ARGUMENTS = $__131.ARGUMENTS,
+      THIS = $__131.THIS;
+  var createIdentifierExpression = System.get("traceur@0.0.32/src/codegeneration/ParseTreeFactory").createIdentifierExpression;
+  var $__131 = System.get("traceur@0.0.32/src/semantics/VariableBinder"),
+      variablesInBlock = $__131.variablesInBlock,
+      variablesInFunction = $__131.variablesInFunction;
+  var AlphaRenamer = function AlphaRenamer(oldName, newName) {
+    $traceurRuntime.superCall(this, $AlphaRenamer.prototype, "constructor", []);
+    this.oldName_ = oldName;
+    this.newName_ = newName;
+  };
+  var $AlphaRenamer = AlphaRenamer;
+  ($traceurRuntime.createClass)(AlphaRenamer, {
+    transformBlock: function(tree) {
+      if (this.oldName_ in variablesInBlock(tree)) {
+        return tree;
+      } else {
+        return $traceurRuntime.superCall(this, $AlphaRenamer.prototype, "transformBlock", [tree]);
+      }
+    },
+    transformIdentifierExpression: function(tree) {
+      if (this.oldName_ == tree.identifierToken.value) {
+        return createIdentifierExpression(this.newName_);
+      } else {
+        return tree;
+      }
+    },
+    transformThisExpression: function(tree) {
+      if (this.oldName_ !== THIS)
+        return tree;
+      return createIdentifierExpression(this.newName_);
+    },
+    transformFunctionDeclaration: function(tree) {
+      if (this.oldName_ === tree.name) {
+        tree = new FunctionDeclaration(tree.location, this.newName_, tree.isGenerator, tree.formalParameterList, tree.typeAnnotation, tree.annotations, tree.functionBody);
+      }
+      if (this.getDoNotRecurse(tree))
+        return tree;
+      return $traceurRuntime.superCall(this, $AlphaRenamer.prototype, "transformFunctionDeclaration", [tree]);
+    },
+    transformFunctionExpression: function(tree) {
+      if (this.oldName_ === tree.name) {
+        tree = new FunctionExpression(tree.location, this.newName_, tree.isGenerator, tree.formalParameterList, tree.typeAnnotation, tree.annotations, tree.functionBody);
+      }
+      if (this.getDoNotRecurse(tree))
+        return tree;
+      return $traceurRuntime.superCall(this, $AlphaRenamer.prototype, "transformFunctionExpression", [tree]);
+    },
+    getDoNotRecurse: function(tree) {
+      return this.oldName_ === ARGUMENTS || this.oldName_ === THIS || this.oldName_ in variablesInFunction(tree);
+    },
+    transformCatch: function(tree) {
+      if (!tree.binding.isPattern() && this.oldName_ === tree.binding.identifierToken.value) {
+        return tree;
+      }
+      return $traceurRuntime.superCall(this, $AlphaRenamer.prototype, "transformCatch", [tree]);
+    }
+  }, {rename: function(tree, oldName, newName) {
+      return new $AlphaRenamer(oldName, newName).transformAny(tree);
+    }}, ParseTreeTransformer);
+  return {get AlphaRenamer() {
+      return AlphaRenamer;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/alphaRenameThisAndArguments", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/alphaRenameThisAndArguments";
+  var $__133 = System.get("traceur@0.0.32/src/syntax/PredefinedName"),
+      ARGUMENTS = $__133.ARGUMENTS,
+      THIS = $__133.THIS;
+  var AlphaRenamer = System.get("traceur@0.0.32/src/codegeneration/AlphaRenamer").AlphaRenamer;
+  var FindInFunctionScope = System.get("traceur@0.0.32/src/codegeneration/FindInFunctionScope").FindInFunctionScope;
+  var FindThisOrArguments = function FindThisOrArguments(tree) {
+    this.foundThis = false;
+    this.foundArguments = false;
+    $traceurRuntime.superCall(this, $FindThisOrArguments.prototype, "constructor", [tree]);
+  };
+  var $FindThisOrArguments = FindThisOrArguments;
+  ($traceurRuntime.createClass)(FindThisOrArguments, {
+    visitThisExpression: function(tree) {
+      this.foundThis = true;
+      this.found = this.foundArguments;
+    },
+    visitIdentifierExpression: function(tree) {
+      if (tree.identifierToken.value === ARGUMENTS) {
+        this.foundArguments = true;
+        this.found = this.foundThis;
+      }
+    }
+  }, {}, FindInFunctionScope);
+  var $__default = function alphaRenameThisAndArguments(tempVarTransformer, tree) {
+    var finder = new FindThisOrArguments(tree);
+    if (finder.foundArguments) {
+      var argumentsTempName = tempVarTransformer.addTempVarForArguments();
+      tree = AlphaRenamer.rename(tree, ARGUMENTS, argumentsTempName);
+    }
+    if (finder.foundThis) {
+      var thisTempName = tempVarTransformer.addTempVarForThis();
+      tree = AlphaRenamer.rename(tree, THIS, thisTempName);
+    }
+    return tree;
+  };
+  return {get default() {
+      return $__default;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/ComprehensionTransformer", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/ComprehensionTransformer";
+  var alphaRenameThisAndArguments = System.get("traceur@0.0.32/src/codegeneration/alphaRenameThisAndArguments").default;
+  var FunctionExpression = System.get("traceur@0.0.32/src/syntax/trees/ParseTrees").FunctionExpression;
+  var TempVarTransformer = System.get("traceur@0.0.32/src/codegeneration/TempVarTransformer").TempVarTransformer;
+  var $__135 = System.get("traceur@0.0.32/src/syntax/TokenType"),
+      LET = $__135.LET,
+      VAR = $__135.VAR;
+  var $__135 = System.get("traceur@0.0.32/src/syntax/trees/ParseTreeType"),
+      COMPREHENSION_FOR = $__135.COMPREHENSION_FOR,
+      COMPREHENSION_IF = $__135.COMPREHENSION_IF;
+  var $__135 = System.get("traceur@0.0.32/src/codegeneration/ParseTreeFactory"),
+      createCallExpression = $__135.createCallExpression,
+      createEmptyParameterList = $__135.createEmptyParameterList,
+      createForOfStatement = $__135.createForOfStatement,
+      createFunctionBody = $__135.createFunctionBody,
+      createIfStatement = $__135.createIfStatement,
+      createParenExpression = $__135.createParenExpression,
+      createVariableDeclarationList = $__135.createVariableDeclarationList;
+  var options = System.get("traceur@0.0.32/src/options").options;
+  var ComprehensionTransformer = function ComprehensionTransformer() {
+    $traceurRuntime.defaultSuperCall(this, $ComprehensionTransformer.prototype, arguments);
+  };
+  var $ComprehensionTransformer = ComprehensionTransformer;
+  ($traceurRuntime.createClass)(ComprehensionTransformer, {transformComprehension: function(tree, statement, isGenerator) {
+      var prefix = arguments[3];
+      var suffix = arguments[4];
+      var bindingKind = isGenerator || !options.blockBinding ? VAR : LET;
+      var statements = prefix ? [prefix] : [];
+      for (var i = tree.comprehensionList.length - 1; i >= 0; i--) {
+        var item = tree.comprehensionList[i];
+        switch (item.type) {
+          case COMPREHENSION_IF:
+            var expression = this.transformAny(item.expression);
+            statement = createIfStatement(expression, statement);
+            break;
+          case COMPREHENSION_FOR:
+            var left = this.transformAny(item.left);
+            var iterator = this.transformAny(item.iterator);
+            var initialiser = createVariableDeclarationList(bindingKind, left, null);
+            statement = createForOfStatement(initialiser, iterator, statement);
+            break;
+          default:
+            throw new Error('Unreachable.');
+        }
+      }
+      statement = alphaRenameThisAndArguments(this, statement);
+      statements.push(statement);
+      if (suffix)
+        statements.push(suffix);
+      var func = new FunctionExpression(null, null, isGenerator, createEmptyParameterList(), null, [], createFunctionBody(statements));
+      return createParenExpression(createCallExpression(func));
+    }}, {}, TempVarTransformer);
+  return {get ComprehensionTransformer() {
+      return ComprehensionTransformer;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/ArrayComprehensionTransformer", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/ArrayComprehensionTransformer";
+  var $__136 = Object.freeze(Object.defineProperties(["var ", " = 0, ", " = [];"], {raw: {value: Object.freeze(["var ", " = 0, ", " = [];"])}})),
+      $__137 = Object.freeze(Object.defineProperties(["", "[", "++] = ", ";"], {raw: {value: Object.freeze(["", "[", "++] = ", ";"])}})),
+      $__138 = Object.freeze(Object.defineProperties(["return ", ";"], {raw: {value: Object.freeze(["return ", ";"])}}));
+  var ComprehensionTransformer = System.get("traceur@0.0.32/src/codegeneration/ComprehensionTransformer").ComprehensionTransformer;
+  var createIdentifierExpression = System.get("traceur@0.0.32/src/codegeneration/ParseTreeFactory").createIdentifierExpression;
+  var parseStatement = System.get("traceur@0.0.32/src/codegeneration/PlaceholderParser").parseStatement;
+  var ArrayComprehensionTransformer = function ArrayComprehensionTransformer() {
+    $traceurRuntime.defaultSuperCall(this, $ArrayComprehensionTransformer.prototype, arguments);
+  };
+  var $ArrayComprehensionTransformer = ArrayComprehensionTransformer;
+  ($traceurRuntime.createClass)(ArrayComprehensionTransformer, {transformArrayComprehension: function(tree) {
+      this.pushTempVarState();
+      var expression = this.transformAny(tree.expression);
+      var index = createIdentifierExpression(this.getTempIdentifier());
+      var result = createIdentifierExpression(this.getTempIdentifier());
+      var tempVarsStatatement = parseStatement($__136, index, result);
+      var statement = parseStatement($__137, result, index, expression);
+      var returnStatement = parseStatement($__138, result);
+      var isGenerator = false;
+      var result = this.transformComprehension(tree, statement, isGenerator, tempVarsStatatement, returnStatement);
+      this.popTempVarState();
+      return result;
+    }}, {}, ComprehensionTransformer);
+  return {get ArrayComprehensionTransformer() {
+      return ArrayComprehensionTransformer;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/ArrowFunctionTransformer", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/ArrowFunctionTransformer";
+  var FormalParameterList = System.get("traceur@0.0.32/src/syntax/trees/ParseTrees").FormalParameterList;
+  var TempVarTransformer = System.get("traceur@0.0.32/src/codegeneration/TempVarTransformer").TempVarTransformer;
+  var $__142 = System.get("traceur@0.0.32/src/syntax/trees/ParseTreeType"),
+      FUNCTION_BODY = $__142.FUNCTION_BODY,
+      FUNCTION_EXPRESSION = $__142.FUNCTION_EXPRESSION;
+  var alphaRenameThisAndArguments = System.get("traceur@0.0.32/src/codegeneration/alphaRenameThisAndArguments").default;
+  var $__142 = System.get("traceur@0.0.32/src/codegeneration/ParseTreeFactory"),
+      createFunctionBody = $__142.createFunctionBody,
+      createFunctionExpression = $__142.createFunctionExpression,
+      createParenExpression = $__142.createParenExpression,
+      createReturnStatement = $__142.createReturnStatement;
+  var ArrowFunctionTransformer = function ArrowFunctionTransformer() {
+    $traceurRuntime.defaultSuperCall(this, $ArrowFunctionTransformer.prototype, arguments);
+  };
+  var $ArrowFunctionTransformer = ArrowFunctionTransformer;
+  ($traceurRuntime.createClass)(ArrowFunctionTransformer, {transformArrowFunctionExpression: function(tree) {
+      var parameters;
+      if (tree.formalParameters) {
+        parameters = this.transformAny(tree.formalParameters).parameters;
+      } else {
+        parameters = [];
+      }
+      var alphaRenamed = alphaRenameThisAndArguments(this, tree);
+      var functionBody = this.transformAny(alphaRenamed.functionBody);
+      if (functionBody.type != FUNCTION_BODY) {
+        functionBody = createFunctionBody([createReturnStatement(functionBody)]);
+      }
+      return createParenExpression(createFunctionExpression(new FormalParameterList(null, parameters), functionBody));
+    }}, {}, TempVarTransformer);
+  return {get ArrowFunctionTransformer() {
+      return ArrowFunctionTransformer;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/BlockBindingTransformer", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/BlockBindingTransformer";
+  var AlphaRenamer = System.get("traceur@0.0.32/src/codegeneration/AlphaRenamer").AlphaRenamer;
+  var $__145 = System.get("traceur@0.0.32/src/syntax/trees/ParseTreeType"),
+      BINDING_IDENTIFIER = $__145.BINDING_IDENTIFIER,
+      BLOCK = $__145.BLOCK,
+      VARIABLE_DECLARATION_LIST = $__145.VARIABLE_DECLARATION_LIST;
+  var $__145 = System.get("traceur@0.0.32/src/syntax/trees/ParseTrees"),
+      FunctionDeclaration = $__145.FunctionDeclaration,
+      FunctionExpression = $__145.FunctionExpression;
+  var ParseTreeTransformer = System.get("traceur@0.0.32/src/codegeneration/ParseTreeTransformer").ParseTreeTransformer;
+  var $__145 = System.get("traceur@0.0.32/src/syntax/TokenType"),
+      CONST = $__145.CONST,
+      LET = $__145.LET,
+      VAR = $__145.VAR;
+  var $__145 = System.get("traceur@0.0.32/src/codegeneration/ParseTreeFactory"),
+      createAssignmentExpression = $__145.createAssignmentExpression,
+      createBindingIdentifier = $__145.createBindingIdentifier,
+      createBlock = $__145.createBlock,
+      createCatch = $__145.createCatch,
+      createEmptyStatement = $__145.createEmptyStatement,
+      createExpressionStatement = $__145.createExpressionStatement,
+      createFinally = $__145.createFinally,
+      createForInStatement = $__145.createForInStatement,
+      createForStatement = $__145.createForStatement,
+      createFunctionBody = $__145.createFunctionBody,
+      createIdentifierExpression = $__145.createIdentifierExpression,
+      createIdentifierToken = $__145.createIdentifierToken,
+      createThrowStatement = $__145.createThrowStatement,
+      createTryStatement = $__145.createTryStatement,
+      createUndefinedExpression = $__145.createUndefinedExpression,
+      createVariableDeclaration = $__145.createVariableDeclaration,
+      createVariableDeclarationList = $__145.createVariableDeclarationList,
+      createVariableStatement = $__145.createVariableStatement;
+  var ScopeType = {
+    SCRIPT: 'SCRIPT',
+    FUNCTION: 'FUNCTION',
+    BLOCK: 'BLOCK'
+  };
+  var Scope = function Scope(parent, type) {
+    this.parent = parent;
+    this.type = type;
+    this.blockVariables = null;
+  };
+  ($traceurRuntime.createClass)(Scope, {addBlockScopedVariable: function(value) {
+      if (!this.blockVariables) {
+        this.blockVariables = Object.create(null);
+      }
+      this.blockVariables[value] = true;
+    }}, {});
+  ;
+  var Rename = function Rename(oldName, newName) {
+    this.oldName = oldName;
+    this.newName = newName;
+  };
+  ($traceurRuntime.createClass)(Rename, {}, {});
+  function renameAll(renames, tree) {
+    renames.forEach((function(rename) {
+      tree = AlphaRenamer.rename(tree, rename.oldName, rename.newName);
+    }));
+    return tree;
+  }
+  function toBlock(statement) {
+    return statement.type == BLOCK ? statement : createBlock(statement);
+  }
+  var BlockBindingTransformer = function BlockBindingTransformer(stateAllocator) {
+    $traceurRuntime.superCall(this, $BlockBindingTransformer.prototype, "constructor", []);
+    this.scope_ = null;
+  };
+  var $BlockBindingTransformer = BlockBindingTransformer;
+  ($traceurRuntime.createClass)(BlockBindingTransformer, {
+    createScriptScope_: function() {
+      return new Scope(this.scope_, ScopeType.SCRIPT);
+    },
+    createFunctionScope_: function() {
+      if (this.scope_ == null) {
+        throw new Error('Top level function scope found.');
+      }
+      return new Scope(this.scope_, ScopeType.FUNCTION);
+    },
+    createBlockScope_: function() {
+      if (this.scope_ == null) {
+        throw new Error('Top level block scope found.');
+      }
+      return new Scope(this.scope_, ScopeType.BLOCK);
+    },
+    push_: function(scope) {
+      this.scope_ = scope;
+      return scope;
+    },
+    pop_: function(scope) {
+      if (this.scope_ != scope) {
+        throw new Error('BlockBindingTransformer scope mismatch');
+      }
+      this.scope_ = scope.parent;
+    },
+    transformBlock: function(tree) {
+      var scope = this.push_(this.createBlockScope_());
+      var statements = this.transformList(tree.statements);
+      if (scope.blockVariables != null) {
+        tree = toBlock(this.rewriteAsCatch_(scope.blockVariables, createBlock(statements)));
+      } else if (statements != tree.statements) {
+        tree = createBlock(statements);
+      }
+      this.pop_(scope);
+      return tree;
+    },
+    rewriteAsCatch_: function(blockVariables, statement) {
+      for (var variable in blockVariables) {
+        statement = createTryStatement(createBlock(createThrowStatement(createUndefinedExpression())), createCatch(createBindingIdentifier(variable), toBlock(statement)), null);
+      }
+      return statement;
+    },
+    transformClassDeclaration: function(tree) {
+      throw new Error('ClassDeclaration should be transformed away.');
+    },
+    transformForInStatement: function(tree) {
+      var treeBody = tree.body;
+      var initialiser;
+      if (tree.initialiser != null && tree.initialiser.type == VARIABLE_DECLARATION_LIST) {
+        var variables = tree.initialiser;
+        if (variables.declarations.length != 1) {
+          throw new Error('for .. in has != 1 variables');
+        }
+        var variable = variables.declarations[0];
+        var variableName = this.getVariableName_(variable);
+        switch (variables.declarationType) {
+          case LET:
+          case CONST:
+            {
+              if (variable.initialiser != null) {
+                throw new Error('const/let in for-in may not have an initialiser');
+              }
+              initialiser = createVariableDeclarationList(VAR, ("$" + variableName), null);
+              treeBody = this.prependToBlock_(createVariableStatement(LET, variableName, createIdentifierExpression(("$" + variableName))), treeBody);
+              break;
+            }
+          case VAR:
+            initialiser = this.transformVariables_(variables);
+            break;
+          default:
+            throw new Error('Unreachable.');
+        }
+      } else {
+        initialiser = this.transformAny(tree.initialiser);
+      }
+      var result = tree;
+      var collection = this.transformAny(tree.collection);
+      var body = this.transformAny(treeBody);
+      if (initialiser != tree.initialiser || collection != tree.collection || body != tree.body) {
+        result = createForInStatement(initialiser, collection, body);
+      }
+      return result;
+    },
+    prependToBlock_: function(statement, body) {
+      if (body.type == BLOCK) {
+        var block = body;
+        var list = $traceurRuntime.spread([statement], block.statements);
+        return createBlock(list);
+      } else {
+        return createBlock(statement, body);
+      }
+    },
+    transformForStatement: function(tree) {
+      var initialiser;
+      if (tree.initialiser != null && tree.initialiser.type == VARIABLE_DECLARATION_LIST) {
+        var variables = tree.initialiser;
+        switch (variables.declarationType) {
+          case LET:
+          case CONST:
+            return this.transformForLet_(tree, variables);
+          case VAR:
+            initialiser = this.transformVariables_(variables);
+            break;
+          default:
+            throw new Error('Reached unreachable.');
+        }
+      } else {
+        initialiser = this.transformAny(tree.initialiser);
+      }
+      var condition = this.transformAny(tree.condition);
+      var increment = this.transformAny(tree.increment);
+      var body = this.transformAny(tree.body);
+      var result = tree;
+      if (initialiser != tree.initialiser || condition != tree.condition || increment != tree.increment || body != tree.body) {
+        result = createForStatement(initialiser, condition, increment, body);
+      }
+      return result;
+    },
+    transformForLet_: function(tree, variables) {
+      var $__143 = this;
+      var copyFwd = [];
+      var copyBak = [];
+      var hoisted = [];
+      var renames = [];
+      variables.declarations.forEach((function(variable) {
+        var variableName = $__143.getVariableName_(variable);
+        var hoistedName = ("$" + variableName);
+        var initialiser = renameAll(renames, variable.initialiser);
+        hoisted.push(createVariableDeclaration(hoistedName, initialiser));
+        copyFwd.push(createVariableDeclaration(variableName, createIdentifierExpression(hoistedName)));
+        copyBak.push(createExpressionStatement(createAssignmentExpression(createIdentifierExpression(hoistedName), createIdentifierExpression(variableName))));
+        renames.push(new Rename(variableName, hoistedName));
+      }));
+      var condition = renameAll(renames, tree.condition);
+      var increment = renameAll(renames, tree.increment);
+      var transformedForLoop = createBlock(createVariableStatement(createVariableDeclarationList(LET, hoisted)), createForStatement(null, condition, increment, createBlock(createVariableStatement(createVariableDeclarationList(LET, copyFwd)), createTryStatement(toBlock(tree.body), null, createFinally(createBlock(copyBak))))));
+      return this.transformAny(transformedForLoop);
+    },
+    transformFunctionDeclaration: function(tree) {
+      var body = this.transformFunctionBody(tree.functionBody);
+      var formalParameterList = this.transformAny(tree.formalParameterList);
+      if (this.scope_.type === ScopeType.BLOCK) {
+        this.scope_.addBlockScopedVariable(tree.name.identifierToken.value);
+        return createExpressionStatement(createAssignmentExpression(createIdentifierExpression(tree.name.identifierToken), new FunctionExpression(tree.location, null, tree.isGenerator, formalParameterList, tree.typeAnnotation, tree.annotations, body)));
+      }
+      if (body === tree.functionBody && formalParameterList === tree.formalParameterList) {
+        return tree;
+      }
+      return new FunctionDeclaration(tree.location, tree.name, tree.isGenerator, formalParameterList, tree.typeAnnotation, tree.annotations, body);
+    },
+    transformScript: function(tree) {
+      var scope = this.push_(this.createScriptScope_());
+      var result = $traceurRuntime.superCall(this, $BlockBindingTransformer.prototype, "transformScript", [tree]);
+      this.pop_(scope);
+      return result;
+    },
+    transformVariableDeclaration: function(tree) {
+      throw new Error('Should never see variable declaration tree.');
+    },
+    transformVariableDeclarationList: function(tree) {
+      throw new Error('Should never see variable declaration list.');
+    },
+    transformVariableStatement: function(tree) {
+      if (this.scope_.type == ScopeType.BLOCK) {
+        switch (tree.declarations.declarationType) {
+          case CONST:
+          case LET:
+            return this.transformBlockVariables_(tree.declarations);
+          default:
+            break;
+        }
+      }
+      var variables = this.transformVariables_(tree.declarations);
+      if (variables != tree.declarations) {
+        tree = createVariableStatement(variables);
+      }
+      return tree;
+    },
+    transformBlockVariables_: function(tree) {
+      var $__143 = this;
+      var variables = tree.declarations;
+      var comma = [];
+      variables.forEach((function(variable) {
+        switch (tree.declarationType) {
+          case LET:
+          case CONST:
+            break;
+          default:
+            throw new Error('Only let/const allowed here.');
+        }
+        var variableName = $__143.getVariableName_(variable);
+        $__143.scope_.addBlockScopedVariable(variableName);
+        var initialiser = $__143.transformAny(variable.initialiser);
+        if (initialiser != null) {
+          comma.push(createAssignmentExpression(createIdentifierExpression(variableName), initialiser));
+        }
+      }));
+      switch (comma.length) {
+        case 0:
+          return createEmptyStatement();
+        case 1:
+          return createExpressionStatement(comma[0]);
+        default:
+          for (var i = 0; i < comma.length; i++) {
+            comma[i] = createExpressionStatement(comma[i]);
+          }
+          return createBlock(comma);
+      }
+    },
+    transformVariables_: function(tree) {
+      var variables = tree.declarations;
+      var transformed = null;
+      for (var index = 0; index < variables.length; index++) {
+        var variable = variables[index];
+        var variableName = this.getVariableName_(variable);
+        var initialiser = this.transformAny(variable.initialiser);
+        if (transformed != null || initialiser != variable.initialiser) {
+          if (transformed == null) {
+            transformed = variables.slice(0, index);
+          }
+          transformed.push(createVariableDeclaration(createIdentifierToken(variableName), initialiser));
+        }
+      }
+      if (transformed != null || tree.declarationType != VAR) {
+        var declarations = transformed != null ? transformed : tree.declarations;
+        var declarationType = tree.declarationType != VAR ? VAR : tree.declarationType;
+        tree = createVariableDeclarationList(declarationType, declarations);
+      }
+      return tree;
+    },
+    transformFunctionBody: function(body) {
+      var scope = this.push_(this.createFunctionScope_());
+      body = this.transformFunctionBodyStatements_(body);
+      this.pop_(scope);
+      return body;
+    },
+    transformFunctionBodyStatements_: function(tree) {
+      var statements = this.transformList(tree.statements);
+      if (this.scope_.blockVariables != null) {
+        tree = this.rewriteAsCatch_(this.scope_.blockVariables, createBlock(statements));
+      } else if (statements != tree.statements) {
+        tree = createFunctionBody(statements);
+      }
+      return tree;
+    },
+    getVariableName_: function(variable) {
+      var lvalue = variable.lvalue;
+      if (lvalue.type == BINDING_IDENTIFIER) {
+        return lvalue.identifierToken.value;
+      }
+      throw new Error('Unexpected destructuring declaration found.');
+    }
+  }, {}, ParseTreeTransformer);
+  return {get BlockBindingTransformer() {
+      return BlockBindingTransformer;
+    }};
+});
+System.register("traceur@0.0.32/src/semantics/util", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/semantics/util";
+  var $__146 = System.get("traceur@0.0.32/src/syntax/trees/ParseTreeType"),
+      IDENTIFIER_EXPRESSION = $__146.IDENTIFIER_EXPRESSION,
+      LITERAL_EXPRESSION = $__146.LITERAL_EXPRESSION,
+      PAREN_EXPRESSION = $__146.PAREN_EXPRESSION,
+      UNARY_EXPRESSION = $__146.UNARY_EXPRESSION;
+  var UNDEFINED = System.get("traceur@0.0.32/src/syntax/PredefinedName").UNDEFINED;
+  var VOID = System.get("traceur@0.0.32/src/syntax/TokenType").VOID;
+  function hasUseStrict(list) {
+    for (var i = 0; i < list.length; i++) {
+      if (!list[i].isDirectivePrologue())
+        return false;
+      if (list[i].isUseStrictDirective())
+        return true;
+    }
+    return false;
+  }
+  function isUndefined(tree) {
+    if (tree.type === PAREN_EXPRESSION)
+      return isUndefined(tree.expression);
+    return tree.type === IDENTIFIER_EXPRESSION && tree.identifierToken.value === UNDEFINED;
+  }
+  function isVoidExpression(tree) {
+    if (tree.type === PAREN_EXPRESSION)
+      return isVoidExpression(tree.expression);
+    return tree.type === UNARY_EXPRESSION && tree.operator.type === VOID && isLiteralExpression(tree.operand);
+  }
+  function isLiteralExpression(tree) {
+    if (tree.type === PAREN_EXPRESSION)
+      return isLiteralExpression(tree.expression);
+    return tree.type === LITERAL_EXPRESSION;
+  }
+  return {
+    get hasUseStrict() {
+      return hasUseStrict;
+    },
+    get isUndefined() {
+      return isUndefined;
+    },
+    get isVoidExpression() {
+      return isVoidExpression;
+    },
+    get isLiteralExpression() {
+      return isLiteralExpression;
+    }
+  };
+});
+System.register("traceur@0.0.32/src/codegeneration/MakeStrictTransformer", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/MakeStrictTransformer";
+  var $__148 = System.get("traceur@0.0.32/src/syntax/trees/ParseTrees"),
+      FunctionBody = $__148.FunctionBody,
+      Script = $__148.Script;
+  var ParseTreeTransformer = System.get("traceur@0.0.32/src/codegeneration/ParseTreeTransformer").ParseTreeTransformer;
+  var createUseStrictDirective = System.get("traceur@0.0.32/src/codegeneration/ParseTreeFactory").createUseStrictDirective;
+  var hasUseStrict = System.get("traceur@0.0.32/src/semantics/util").hasUseStrict;
+  function prepend(statements) {
+    return $traceurRuntime.spread([createUseStrictDirective()], statements);
+  }
+  var MakeStrictTransformer = function MakeStrictTransformer() {
+    $traceurRuntime.defaultSuperCall(this, $MakeStrictTransformer.prototype, arguments);
+  };
+  var $MakeStrictTransformer = MakeStrictTransformer;
+  ($traceurRuntime.createClass)(MakeStrictTransformer, {
+    transformScript: function(tree) {
+      if (hasUseStrict(tree.scriptItemList))
+        return tree;
+      return new Script(tree.location, prepend(tree.scriptItemList));
+    },
+    transformFunctionBody: function(tree) {
+      if (hasUseStrict(tree.statements))
+        return tree;
+      return new FunctionBody(tree.location, prepend(tree.statements));
+    }
+  }, {transformTree: function(tree) {
+      return new $MakeStrictTransformer().transformAny(tree);
+    }}, ParseTreeTransformer);
+  return {get MakeStrictTransformer() {
+      return MakeStrictTransformer;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/assignmentOperatorToBinaryOperator", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/assignmentOperatorToBinaryOperator";
+  var $__149 = System.get("traceur@0.0.32/src/syntax/TokenType"),
+      AMPERSAND = $__149.AMPERSAND,
+      AMPERSAND_EQUAL = $__149.AMPERSAND_EQUAL,
+      BAR = $__149.BAR,
+      BAR_EQUAL = $__149.BAR_EQUAL,
+      CARET = $__149.CARET,
+      CARET_EQUAL = $__149.CARET_EQUAL,
+      LEFT_SHIFT = $__149.LEFT_SHIFT,
+      LEFT_SHIFT_EQUAL = $__149.LEFT_SHIFT_EQUAL,
+      MINUS = $__149.MINUS,
+      MINUS_EQUAL = $__149.MINUS_EQUAL,
+      PERCENT = $__149.PERCENT,
+      PERCENT_EQUAL = $__149.PERCENT_EQUAL,
+      PLUS = $__149.PLUS,
+      PLUS_EQUAL = $__149.PLUS_EQUAL,
+      RIGHT_SHIFT = $__149.RIGHT_SHIFT,
+      RIGHT_SHIFT_EQUAL = $__149.RIGHT_SHIFT_EQUAL,
+      SLASH = $__149.SLASH,
+      SLASH_EQUAL = $__149.SLASH_EQUAL,
+      STAR = $__149.STAR,
+      STAR_EQUAL = $__149.STAR_EQUAL,
+      UNSIGNED_RIGHT_SHIFT = $__149.UNSIGNED_RIGHT_SHIFT,
+      UNSIGNED_RIGHT_SHIFT_EQUAL = $__149.UNSIGNED_RIGHT_SHIFT_EQUAL;
+  function assignmentOperatorToBinaryOperator(type) {
+    switch (type) {
+      case STAR_EQUAL:
+        return STAR;
+      case SLASH_EQUAL:
+        return SLASH;
+      case PERCENT_EQUAL:
+        return PERCENT;
+      case PLUS_EQUAL:
+        return PLUS;
+      case MINUS_EQUAL:
+        return MINUS;
+      case LEFT_SHIFT_EQUAL:
+        return LEFT_SHIFT;
+      case RIGHT_SHIFT_EQUAL:
+        return RIGHT_SHIFT;
+      case UNSIGNED_RIGHT_SHIFT_EQUAL:
+        return UNSIGNED_RIGHT_SHIFT;
+      case AMPERSAND_EQUAL:
+        return AMPERSAND;
+      case CARET_EQUAL:
+        return CARET;
+      case BAR_EQUAL:
+        return BAR;
+      default:
+        throw Error('unreachable');
+    }
+  }
+  var $__default = assignmentOperatorToBinaryOperator;
+  return {get default() {
+      return $__default;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/ExplodeExpressionTransformer", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/ExplodeExpressionTransformer";
+  var ParseTreeTransformer = System.get("traceur@0.0.32/src/codegeneration/ParseTreeTransformer").ParseTreeTransformer;
+  var $__151 = System.get("traceur@0.0.32/src/codegeneration/ParseTreeFactory"),
+      createAssignmentExpression = $__151.createAssignmentExpression,
+      createCommaExpression = $__151.createCommaExpression,
+      id = $__151.createIdentifierExpression,
+      createMemberExpression = $__151.createMemberExpression,
+      createNumberLiteral = $__151.createNumberLiteral,
+      createOperatorToken = $__151.createOperatorToken,
+      createParenExpression = $__151.createParenExpression;
+  var $__151 = System.get("traceur@0.0.32/src/syntax/TokenType"),
+      AND = $__151.AND,
+      EQUAL = $__151.EQUAL,
+      MINUS = $__151.MINUS,
+      MINUS_EQUAL = $__151.MINUS_EQUAL,
+      MINUS_MINUS = $__151.MINUS_MINUS,
+      OR = $__151.OR,
+      PLUS = $__151.PLUS,
+      PLUS_EQUAL = $__151.PLUS_EQUAL,
+      PLUS_PLUS = $__151.PLUS_PLUS;
+  var $__151 = System.get("traceur@0.0.32/src/syntax/trees/ParseTreeType"),
+      COMMA_EXPRESSION = $__151.COMMA_EXPRESSION,
+      IDENTIFIER_EXPRESSION = $__151.IDENTIFIER_EXPRESSION,
+      LITERAL_EXPRESSION = $__151.LITERAL_EXPRESSION,
+      MEMBER_EXPRESSION = $__151.MEMBER_EXPRESSION,
+      MEMBER_LOOKUP_EXPRESSION = $__151.MEMBER_LOOKUP_EXPRESSION,
+      PROPERTY_NAME_ASSIGNMENT = $__151.PROPERTY_NAME_ASSIGNMENT,
+      SPREAD_EXPRESSION = $__151.SPREAD_EXPRESSION,
+      TEMPLATE_LITERAL_PORTION = $__151.TEMPLATE_LITERAL_PORTION;
+  var $__151 = System.get("traceur@0.0.32/src/syntax/trees/ParseTrees"),
+      ArgumentList = $__151.ArgumentList,
+      ArrayLiteralExpression = $__151.ArrayLiteralExpression,
+      BinaryOperator = $__151.BinaryOperator,
+      CallExpression = $__151.CallExpression,
+      ConditionalExpression = $__151.ConditionalExpression,
+      MemberExpression = $__151.MemberExpression,
+      MemberLookupExpression = $__151.MemberLookupExpression,
+      NewExpression = $__151.NewExpression,
+      ObjectLiteralExpression = $__151.ObjectLiteralExpression,
+      PropertyNameAssignment = $__151.PropertyNameAssignment,
+      SpreadExpression = $__151.SpreadExpression,
+      TemplateLiteralExpression = $__151.TemplateLiteralExpression,
+      TemplateSubstitution = $__151.TemplateSubstitution,
+      UnaryExpression = $__151.UnaryExpression,
+      YieldExpression = $__151.YieldExpression;
+  var assert = System.get("traceur@0.0.32/src/util/assert").assert;
+  var assignmentOperatorToBinaryOperator = System.get("traceur@0.0.32/src/codegeneration/assignmentOperatorToBinaryOperator").default;
+  var CommaExpressionBuilder = function CommaExpressionBuilder(tempVar) {
+    this.tempVar = tempVar;
+    this.expressions = [];
+  };
+  ($traceurRuntime.createClass)(CommaExpressionBuilder, {
+    add: function(tree) {
+      var $__152;
+      if (tree.type === COMMA_EXPRESSION)
+        ($__152 = this.expressions).push.apply($__152, $traceurRuntime.toObject(getExpressions(tree)));
+      return this;
+    },
+    build: function(tree) {
+      var tempVar = this.tempVar;
+      this.expressions.push(createAssignmentExpression(tempVar, tree), tempVar);
+      return createCommaExpression(this.expressions);
+    }
+  }, {});
+  function getResult(tree) {
+    if (tree.type === COMMA_EXPRESSION)
+      return tree.expressions[tree.expressions.length - 1];
+    return tree;
+  }
+  function getExpressions(tree) {
+    if (tree.type === COMMA_EXPRESSION)
+      return tree.expressions.slice(0, -1);
+    return [];
+  }
+  var ExplodeExpressionTransformer = function ExplodeExpressionTransformer(tempVarTransformer) {
+    $traceurRuntime.superCall(this, $ExplodeExpressionTransformer.prototype, "constructor", []);
+    this.tempVarTransformer_ = tempVarTransformer;
+  };
+  var $ExplodeExpressionTransformer = ExplodeExpressionTransformer;
+  ($traceurRuntime.createClass)(ExplodeExpressionTransformer, {
+    addTempVar: function() {
+      var tmpId = this.tempVarTransformer_.addTempVar();
+      return id(tmpId);
+    },
+    transformUnaryExpression: function(tree) {
+      if (tree.operator.type == PLUS_PLUS)
+        return this.transformUnaryNumeric(tree, PLUS_EQUAL);
+      if (tree.operator.type == MINUS_MINUS)
+        return this.transformUnaryNumeric(tree, MINUS_EQUAL);
+      var operand = this.transformAny(tree.operand);
+      if (operand === tree.operand)
+        return tree;
+      var expressions = $traceurRuntime.spread(getExpressions(operand), [new UnaryExpression(tree.location, tree.operator, getResult(operand))]);
+      return createCommaExpression(expressions);
+    },
+    transformUnaryNumeric: function(tree, operator) {
+      return this.transformAny(new BinaryOperator(tree.location, tree.operand, createOperatorToken(operator), createNumberLiteral(1)));
+    },
+    transformPostfixExpression: function(tree) {
+      if (tree.operand.type === MEMBER_EXPRESSION)
+        return this.transformPostfixMemberExpression(tree);
+      if (tree.operand.type === MEMBER_LOOKUP_EXPRESSION)
+        return this.transformPostfixMemberLookupExpression(tree);
+      assert(tree.operand.type === IDENTIFIER_EXPRESSION);
+      var operand = tree.operand;
+      var tmp = this.addTempVar();
+      var operator = tree.operator.type === PLUS_PLUS ? PLUS : MINUS;
+      var expressions = [createAssignmentExpression(tmp, operand), createAssignmentExpression(operand, new BinaryOperator(tree.location, tmp, createOperatorToken(operator), createNumberLiteral(1))), tmp];
+      return createCommaExpression(expressions);
+    },
+    transformPostfixMemberExpression: function(tree) {
+      var memberName = tree.operand.memberName;
+      var operand = this.transformAny(tree.operand.operand);
+      var tmp = this.addTempVar();
+      var memberExpression = new MemberExpression(tree.operand.location, getResult(operand), memberName);
+      var operator = tree.operator.type === PLUS_PLUS ? PLUS : MINUS;
+      var expressions = $traceurRuntime.spread(getExpressions(operand), [createAssignmentExpression(tmp, memberExpression), createAssignmentExpression(memberExpression, new BinaryOperator(tree.location, tmp, createOperatorToken(operator), createNumberLiteral(1))), tmp]);
+      return createCommaExpression(expressions);
+    },
+    transformPostfixMemberLookupExpression: function(tree) {
+      var memberExpression = this.transformAny(tree.operand.memberExpression);
+      var operand = this.transformAny(tree.operand.operand);
+      var tmp = this.addTempVar();
+      var memberLookupExpression = new MemberLookupExpression(null, getResult(operand), getResult(memberExpression));
+      var operator = tree.operator.type === PLUS_PLUS ? PLUS : MINUS;
+      var expressions = $traceurRuntime.spread(getExpressions(operand), getExpressions(memberExpression), [createAssignmentExpression(tmp, memberLookupExpression), createAssignmentExpression(memberLookupExpression, new BinaryOperator(tree.location, tmp, createOperatorToken(operator), createNumberLiteral(1))), tmp]);
+      return createCommaExpression(expressions);
+    },
+    transformYieldExpression: function(tree) {
+      var expression = this.transformAny(tree.expression);
+      return this.createCommaExpressionBuilder().add(expression).build(new YieldExpression(tree.location, getResult(expression), tree.isYieldFor));
+    },
+    transformParenExpression: function(tree) {
+      var expression = this.transformAny(tree.expression);
+      if (expression === tree.expression)
+        return tree;
+      var result = getResult(expression);
+      if (result.type === IDENTIFIER_EXPRESSION)
+        return expression;
+      return this.createCommaExpressionBuilder().add(expression).build(result);
+    },
+    transformCommaExpression: function(tree) {
+      var expressions = this.transformList(tree.expressions);
+      if (expressions === tree.expressions)
+        return tree;
+      var builder = new CommaExpressionBuilder(null);
+      for (var i = 0; i < expressions.length; i++) {
+        builder.add(expressions[i]);
+      }
+      return createCommaExpression($traceurRuntime.spread(builder.expressions, [getResult(expressions[expressions.length - 1])]));
+    },
+    transformMemberExpression: function(tree) {
+      var operand = this.transformAny(tree.operand);
+      return this.createCommaExpressionBuilder().add(operand).build(new MemberExpression(tree.location, getResult(operand), tree.memberName));
+    },
+    transformMemberLookupExpression: function(tree) {
+      var operand = this.transformAny(tree.operand);
+      var memberExpression = this.transformAny(tree.memberExpression);
+      return this.createCommaExpressionBuilder().add(operand).add(memberExpression).build(new MemberLookupExpression(tree.location, getResult(operand), getResult(memberExpression)));
+    },
+    transformBinaryOperator: function(tree) {
+      if (tree.operator.isAssignmentOperator())
+        return this.transformAssignmentExpression(tree);
+      var left = this.transformAny(tree.left);
+      var right = this.transformAny(tree.right);
+      if (left === tree.left && right === tree.right)
+        return tree;
+      if (tree.operator.type === OR)
+        return this.transformOr(left, right);
+      if (tree.operator.type === AND)
+        return this.transformAnd(left, right);
+      var expressions = $traceurRuntime.spread(getExpressions(left), getExpressions(right), [new BinaryOperator(tree.location, getResult(left), tree.operator, getResult(right))]);
+      return createCommaExpression(expressions);
+    },
+    transformAssignmentExpression: function(tree) {
+      var left = tree.left;
+      if (left.type === MEMBER_EXPRESSION)
+        return this.transformAssignMemberExpression(tree);
+      if (left.type === MEMBER_LOOKUP_EXPRESSION)
+        return this.transformAssignMemberLookupExpression(tree);
+      assert(tree.left.type === IDENTIFIER_EXPRESSION);
+      if (tree.operator.type === EQUAL) {
+        var left = this.transformAny(left);
+        var right = this.transformAny(tree.right);
+        var expressions = $traceurRuntime.spread(getExpressions(right), [createAssignmentExpression(left, getResult(right)), getResult(right)]);
+        return createCommaExpression(expressions);
+      }
+      var right = this.transformAny(tree.right);
+      var tmp = this.addTempVar();
+      var binop = createOperatorToken(assignmentOperatorToBinaryOperator(tree.operator.type));
+      var expressions = $traceurRuntime.spread(getExpressions(right), [createAssignmentExpression(tmp, new BinaryOperator(tree.location, left, binop, getResult(right))), createAssignmentExpression(left, tmp), tmp]);
+      return createCommaExpression(expressions);
+    },
+    transformAssignMemberExpression: function(tree) {
+      var left = tree.left;
+      if (tree.operator.type === EQUAL) {
+        var operand = this.transformAny(left.operand);
+        var right = this.transformAny(tree.right);
+        var expressions = $traceurRuntime.spread(getExpressions(operand), getExpressions(right), [new BinaryOperator(tree.location, new MemberExpression(left.location, getResult(operand), left.memberName), tree.operator, getResult(right)), getResult(right)]);
+        return createCommaExpression(expressions);
+      }
+      var operand = this.transformAny(left.operand);
+      var right = this.transformAny(tree.right);
+      var tmp = this.addTempVar();
+      var memberExpression = new MemberExpression(left.location, getResult(operand), left.memberName);
+      var tmp2 = this.addTempVar();
+      var binop = createOperatorToken(assignmentOperatorToBinaryOperator(tree.operator.type));
+      var expressions = $traceurRuntime.spread(getExpressions(operand), getExpressions(right), [createAssignmentExpression(tmp, memberExpression), createAssignmentExpression(tmp2, new BinaryOperator(tree.location, tmp, binop, getResult(right))), createAssignmentExpression(memberExpression, tmp2), tmp2]);
+      return createCommaExpression(expressions);
+    },
+    transformAssignMemberLookupExpression: function(tree) {
+      var left = tree.left;
+      if (tree.operator.type === EQUAL) {
+        var operand = this.transformAny(left.operand);
+        var memberExpression = this.transformAny(left.memberExpression);
+        var right = this.transformAny(tree.right);
+        var expressions = $traceurRuntime.spread(getExpressions(operand), getExpressions(memberExpression), getExpressions(right), [new BinaryOperator(tree.location, new MemberLookupExpression(left.location, getResult(operand), getResult(memberExpression)), tree.operator, getResult(right)), getResult(right)]);
+        return createCommaExpression(expressions);
+      }
+      var operand = this.transformAny(left.operand);
+      var memberExpression = this.transformAny(left.memberExpression);
+      var right = this.transformAny(tree.right);
+      var tmp = this.addTempVar();
+      var memberLookupExpression = new MemberLookupExpression(left.location, getResult(operand), getResult(memberExpression));
+      var tmp2 = this.addTempVar();
+      var binop = createOperatorToken(assignmentOperatorToBinaryOperator(tree.operator.type));
+      var expressions = $traceurRuntime.spread(getExpressions(operand), getExpressions(memberExpression), getExpressions(right), [createAssignmentExpression(tmp, memberLookupExpression), createAssignmentExpression(tmp2, new BinaryOperator(tree.location, tmp, binop, getResult(right))), createAssignmentExpression(memberLookupExpression, tmp2), tmp2]);
+      return createCommaExpression(expressions);
+    },
+    transformArrayLiteralExpression: function(tree) {
+      var elements = this.transformList(tree.elements);
+      if (elements === tree.elements)
+        return tree;
+      var builder = this.createCommaExpressionBuilder();
+      var results = [];
+      for (var i = 0; i < elements.length; i++) {
+        builder.add(elements[i]);
+        results.push(getResult(elements[i]));
+      }
+      return builder.build(new ArrayLiteralExpression(tree.location, results));
+    },
+    transformObjectLiteralExpression: function(tree) {
+      var propertyNameAndValues = this.transformList(tree.propertyNameAndValues);
+      if (propertyNameAndValues === tree.propertyNameAndValues)
+        return tree;
+      var builder = this.createCommaExpressionBuilder();
+      var results = [];
+      for (var i = 0; i < propertyNameAndValues.length; i++) {
+        if (propertyNameAndValues[i].type === PROPERTY_NAME_ASSIGNMENT) {
+          builder.add(propertyNameAndValues[i].value);
+          results.push(new PropertyNameAssignment(propertyNameAndValues[i].location, propertyNameAndValues[i].name, getResult(propertyNameAndValues[i].value)));
+        } else {
+          results.push(propertyNameAndValues[i]);
+        }
+      }
+      return builder.build(new ObjectLiteralExpression(tree.location, results));
+    },
+    transformTemplateLiteralExpression: function(tree) {
+      var operand = this.transformAny(tree.operand);
+      var elements = this.transformList(tree.elements);
+      if (!operand && operand === tree.operand && elements === tree.elements)
+        return tree;
+      var builder = this.createCommaExpressionBuilder();
+      if (operand)
+        builder.add(operand);
+      var results = [];
+      for (var i = 0; i < elements.length; i++) {
+        if (elements[i].type === TEMPLATE_LITERAL_PORTION) {
+          results.push(elements[i]);
+        } else {
+          var expression = elements[i].expression;
+          builder.add(expression);
+          var result = getResult(expression);
+          results.push(new TemplateSubstitution(expression.location, result));
+        }
+      }
+      return builder.build(new TemplateLiteralExpression(tree.location, operand && getResult(operand), results));
+    },
+    transformCallExpression: function(tree) {
+      if (tree.operand.type === MEMBER_EXPRESSION)
+        return this.transformCallMemberExpression(tree);
+      if (tree.operand.type === MEMBER_LOOKUP_EXPRESSION)
+        return this.transformCallMemberLookupExpression(tree);
+      return this.transformCallAndNew_(tree, CallExpression);
+    },
+    transformNewExpression: function(tree) {
+      return this.transformCallAndNew_(tree, NewExpression);
+    },
+    transformCallAndNew_: function(tree, ctor) {
+      var operand = this.transformAny(tree.operand);
+      var args = this.transformAny(tree.args);
+      var builder = this.createCommaExpressionBuilder().add(operand);
+      var argResults = [];
+      args.args.forEach((function(arg) {
+        builder.add(arg);
+        argResults.push(getResult(arg));
+      }));
+      return builder.build(new ctor(tree.location, getResult(operand), new ArgumentList(args.location, argResults)));
+    },
+    transformCallMemberExpression: function(tree) {
+      var memberName = tree.operand.memberName;
+      var operand = this.transformAny(tree.operand.operand);
+      var tmp = this.addTempVar();
+      var memberExpresssion = new MemberExpression(tree.operand.location, getResult(operand), memberName);
+      var args = this.transformAny(tree.args);
+      var expressions = $traceurRuntime.spread(getExpressions(operand), [createAssignmentExpression(tmp, memberExpresssion)]);
+      var argResults = [getResult(operand)];
+      args.args.forEach((function(arg) {
+        var $__152;
+        ($__152 = expressions).push.apply($__152, $traceurRuntime.toObject(getExpressions(arg)));
+        argResults.push(getResult(arg));
+      }));
+      var callExpression = new CallExpression(tree.location, createMemberExpression(tmp, 'call'), new ArgumentList(args.location, argResults));
+      var tmp2 = this.addTempVar();
+      expressions.push(createAssignmentExpression(tmp2, callExpression), tmp2);
+      return createCommaExpression(expressions);
+    },
+    transformCallMemberLookupExpression: function(tree) {
+      var operand = this.transformAny(tree.operand.operand);
+      var memberExpression = this.transformAny(tree.operand.memberExpression);
+      var tmp = this.addTempVar();
+      var lookupExpresssion = new MemberLookupExpression(tree.operand.location, getResult(operand), getResult(memberExpression));
+      var args = this.transformAny(tree.args);
+      var expressions = $traceurRuntime.spread(getExpressions(operand), getExpressions(memberExpression), [createAssignmentExpression(tmp, lookupExpresssion)]);
+      var argResults = [getResult(operand)];
+      args.args.forEach((function(arg, i) {
+        var $__152;
+        ($__152 = expressions).push.apply($__152, $traceurRuntime.toObject(getExpressions(arg)));
+        var result = getResult(arg);
+        if (tree.args.args[i].type === SPREAD_EXPRESSION)
+          result = new SpreadExpression(arg.location, result);
+        argResults.push(result);
+      }));
+      var callExpression = new CallExpression(tree.location, createMemberExpression(tmp, 'call'), new ArgumentList(args.location, argResults));
+      var tmp2 = this.addTempVar();
+      expressions.push(createAssignmentExpression(tmp2, callExpression), tmp2);
+      return createCommaExpression(expressions);
+    },
+    transformConditionalExpression: function(tree) {
+      var condition = this.transformAny(tree.condition);
+      var left = this.transformAny(tree.left);
+      var right = this.transformAny(tree.right);
+      if (condition === tree.condition && left === tree.left && right === tree.right)
+        return tree;
+      var res = this.addTempVar();
+      var leftTree = createCommaExpression($traceurRuntime.spread(getExpressions(left), [createAssignmentExpression(res, getResult(left))]));
+      var rightTree = createCommaExpression($traceurRuntime.spread(getExpressions(right), [createAssignmentExpression(res, getResult(right))]));
+      var expressions = $traceurRuntime.spread(getExpressions(condition), [new ConditionalExpression(tree.location, getResult(condition), createParenExpression(leftTree), createParenExpression(rightTree)), res]);
+      return createCommaExpression(expressions);
+    },
+    transformOr: function(left, right) {
+      var res = this.addTempVar();
+      var leftTree = createCommaExpression([createAssignmentExpression(res, getResult(left))]);
+      var rightTree = createCommaExpression($traceurRuntime.spread(getExpressions(right), [createAssignmentExpression(res, getResult(right))]));
+      var expressions = $traceurRuntime.spread(getExpressions(left), [new ConditionalExpression(left.location, getResult(left), createParenExpression(leftTree), createParenExpression(rightTree)), res]);
+      return createCommaExpression(expressions);
+    },
+    transformAnd: function(left, right) {
+      var res = this.addTempVar();
+      var leftTree = createCommaExpression($traceurRuntime.spread(getExpressions(right), [createAssignmentExpression(res, getResult(right))]));
+      var rightTree = createCommaExpression([createAssignmentExpression(res, getResult(left))]);
+      var expressions = $traceurRuntime.spread(getExpressions(left), [new ConditionalExpression(left.location, getResult(left), createParenExpression(leftTree), createParenExpression(rightTree)), res]);
+      return createCommaExpression(expressions);
+    },
+    transformSpreadExpression: function(tree) {
+      var expression = this.transformAny(tree.expression);
+      if (expression === tree.expression)
+        return tree;
+      var result = getResult(expression);
+      if (result.type !== SPREAD_EXPRESSION)
+        result = new SpreadExpression(result.location, result);
+      var expressions = $traceurRuntime.spread(getExpressions(expression), [result]);
+      return createCommaExpression(expressions);
+    },
+    createCommaExpressionBuilder: function() {
+      return new CommaExpressionBuilder(this.addTempVar());
+    }
+  }, {}, ParseTreeTransformer);
+  return {get ExplodeExpressionTransformer() {
+      return ExplodeExpressionTransformer;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/SuperTransformer", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/SuperTransformer";
+  var $__153 = Object.freeze(Object.defineProperties(["$traceurRuntime.superCall(", ", ", ", ", ",\n                                   ", ")"], {raw: {value: Object.freeze(["$traceurRuntime.superCall(", ", ", ", ", ",\n                                   ", ")"])}})),
+      $__154 = Object.freeze(Object.defineProperties(["$traceurRuntime.superGet(", ", ", ", ", ")"], {raw: {value: Object.freeze(["$traceurRuntime.superGet(", ", ", ", ", ")"])}})),
+      $__155 = Object.freeze(Object.defineProperties(["$traceurRuntime.superSet(", ", ", ", ", ",\n                                    ", ")"], {raw: {value: Object.freeze(["$traceurRuntime.superSet(", ", ", ", ", ",\n                                    ", ")"])}}));
+  var ExplodeExpressionTransformer = System.get("traceur@0.0.32/src/codegeneration/ExplodeExpressionTransformer").ExplodeExpressionTransformer;
+  var $__157 = System.get("traceur@0.0.32/src/syntax/trees/ParseTrees"),
+      FunctionDeclaration = $__157.FunctionDeclaration,
+      FunctionExpression = $__157.FunctionExpression;
+  var $__157 = System.get("traceur@0.0.32/src/syntax/trees/ParseTreeType"),
+      LITERAL_PROPERTY_NAME = $__157.LITERAL_PROPERTY_NAME,
+      MEMBER_EXPRESSION = $__157.MEMBER_EXPRESSION,
+      MEMBER_LOOKUP_EXPRESSION = $__157.MEMBER_LOOKUP_EXPRESSION,
+      SUPER_EXPRESSION = $__157.SUPER_EXPRESSION;
+  var ParseTreeTransformer = System.get("traceur@0.0.32/src/codegeneration/ParseTreeTransformer").ParseTreeTransformer;
+  var $__157 = System.get("traceur@0.0.32/src/syntax/TokenType"),
+      EQUAL = $__157.EQUAL,
+      MINUS_MINUS = $__157.MINUS_MINUS,
+      PLUS_PLUS = $__157.PLUS_PLUS;
+  var assert = System.get("traceur@0.0.32/src/util/assert").assert;
+  var $__157 = System.get("traceur@0.0.32/src/codegeneration/ParseTreeFactory"),
+      createArrayLiteralExpression = $__157.createArrayLiteralExpression,
+      createIdentifierExpression = $__157.createIdentifierExpression,
+      createParenExpression = $__157.createParenExpression,
+      createStringLiteral = $__157.createStringLiteral,
+      createThisExpression = $__157.createThisExpression;
+  var parseExpression = System.get("traceur@0.0.32/src/codegeneration/PlaceholderParser").parseExpression;
+  var ExplodeSuperExpression = function ExplodeSuperExpression() {
+    $traceurRuntime.defaultSuperCall(this, $ExplodeSuperExpression.prototype, arguments);
+  };
+  var $ExplodeSuperExpression = ExplodeSuperExpression;
+  ($traceurRuntime.createClass)(ExplodeSuperExpression, {
+    transformArrowFunctionExpression: function(tree) {
+      return tree;
+    },
+    transformClassExpression: function(tree) {
+      return tree;
+    },
+    transformFunctionBody: function(tree) {
+      return tree;
+    }
+  }, {}, ExplodeExpressionTransformer);
+  var SuperTransformer = function SuperTransformer(tempVarTransformer, protoName, methodTree, thisName) {
+    this.tempVarTransformer_ = tempVarTransformer;
+    this.protoName_ = protoName;
+    this.method_ = methodTree;
+    this.superCount_ = 0;
+    this.thisVar_ = createIdentifierExpression(thisName);
+    this.inNestedFunc_ = 0;
+    this.nestedSuperCount_ = 0;
+  };
+  var $SuperTransformer = SuperTransformer;
+  ($traceurRuntime.createClass)(SuperTransformer, {
+    get hasSuper() {
+      return this.superCount_ > 0;
+    },
+    get nestedSuper() {
+      return this.nestedSuperCount_ > 0;
+    },
+    transformFunctionDeclaration: function(tree) {
+      return this.transformFunction_(tree, FunctionDeclaration);
+    },
+    transformFunctionExpression: function(tree) {
+      return this.transformFunction_(tree, FunctionExpression);
+    },
+    transformFunction_: function(tree, constructor) {
+      var oldSuperCount = this.superCount_;
+      this.inNestedFunc_++;
+      var transformedTree = constructor === FunctionExpression ? $traceurRuntime.superCall(this, $SuperTransformer.prototype, "transformFunctionExpression", [tree]) : $traceurRuntime.superCall(this, $SuperTransformer.prototype, "transformFunctionDeclaration", [tree]);
+      this.inNestedFunc_--;
+      if (oldSuperCount !== this.superCount_)
+        this.nestedSuperCount_ += this.superCount_ - oldSuperCount;
+      return transformedTree;
+    },
+    transformGetAccessor: function(tree) {
+      return tree;
+    },
+    transformSetAccessor: function(tree) {
+      return tree;
+    },
+    transformPropertyMethodAssignMent: function(tree) {
+      return tree;
+    },
+    transformCallExpression: function(tree) {
+      if (this.method_ && tree.operand.type == SUPER_EXPRESSION) {
+        this.superCount_++;
+        assert(this.method_.name.type === LITERAL_PROPERTY_NAME);
+        var methodName = this.method_.name.literalToken.value;
+        return this.createSuperCallExpression_(methodName, tree);
+      }
+      if (hasSuperMemberExpression(tree.operand)) {
+        this.superCount_++;
+        var name;
+        if (tree.operand.type == MEMBER_EXPRESSION)
+          name = tree.operand.memberName.value;
+        else
+          name = tree.operand.memberExpression;
+        return this.createSuperCallExpression_(name, tree);
+      }
+      return $traceurRuntime.superCall(this, $SuperTransformer.prototype, "transformCallExpression", [tree]);
+    },
+    createSuperCallExpression_: function(methodName, tree) {
+      var thisExpr = this.inNestedFunc_ ? this.thisVar_ : createThisExpression();
+      var args = createArrayLiteralExpression(tree.args.args);
+      return this.createSuperCallExpression(thisExpr, this.protoName_, methodName, args);
+    },
+    createSuperCallExpression: function(thisExpr, protoName, methodName, args) {
+      return parseExpression($__153, thisExpr, protoName, methodName, args);
+    },
+    transformMemberShared_: function(tree, name) {
+      var thisExpr = this.inNestedFunc_ ? this.thisVar_ : createThisExpression();
+      return parseExpression($__154, thisExpr, this.protoName_, name);
+    },
+    transformMemberExpression: function(tree) {
+      if (tree.operand.type === SUPER_EXPRESSION) {
+        this.superCount_++;
+        return this.transformMemberShared_(tree, createStringLiteral(tree.memberName.value));
+      }
+      return $traceurRuntime.superCall(this, $SuperTransformer.prototype, "transformMemberExpression", [tree]);
+    },
+    transformMemberLookupExpression: function(tree) {
+      if (tree.operand.type === SUPER_EXPRESSION)
+        return this.transformMemberShared_(tree, tree.memberExpression);
+      return $traceurRuntime.superCall(this, $SuperTransformer.prototype, "transformMemberLookupExpression", [tree]);
+    },
+    transformBinaryOperator: function(tree) {
+      if (tree.operator.isAssignmentOperator() && hasSuperMemberExpression(tree.left)) {
+        if (tree.operator.type !== EQUAL) {
+          var exploded = new ExplodeSuperExpression(this.tempVarTransformer_).transformAny(tree);
+          return this.transformAny(createParenExpression(exploded));
+        }
+        this.superCount_++;
+        var name = tree.left.type === MEMBER_LOOKUP_EXPRESSION ? tree.left.memberExpression : createStringLiteral(tree.left.memberName.value);
+        var thisExpr = this.inNestedFunc_ ? this.thisVar_ : createThisExpression();
+        var right = this.transformAny(tree.right);
+        return parseExpression($__155, thisExpr, this.protoName_, name, right);
+      }
+      return $traceurRuntime.superCall(this, $SuperTransformer.prototype, "transformBinaryOperator", [tree]);
+    },
+    transformUnaryExpression: function(tree) {
+      var transformed = this.transformIncrementDecrement_(tree);
+      if (transformed)
+        return transformed;
+      return $traceurRuntime.superCall(this, $SuperTransformer.prototype, "transformUnaryExpression", [tree]);
+    },
+    transformPostfixExpression: function(tree) {
+      var transformed = this.transformIncrementDecrement_(tree);
+      if (transformed)
+        return transformed;
+      return $traceurRuntime.superCall(this, $SuperTransformer.prototype, "transformPostfixExpression", [tree]);
+    },
+    transformIncrementDecrement_: function(tree) {
+      var operator = tree.operator;
+      var operand = tree.operand;
+      if ((operator.type === PLUS_PLUS || operator.type === MINUS_MINUS) && hasSuperMemberExpression(operand)) {
+        var exploded = new ExplodeSuperExpression(this.tempVarTransformer_).transformAny(tree);
+        if (exploded !== tree)
+          exploded = createParenExpression(exploded);
+        return this.transformAny(exploded);
+      }
+      return null;
+    }
+  }, {}, ParseTreeTransformer);
+  function hasSuperMemberExpression(tree) {
+    if (tree.type !== MEMBER_EXPRESSION && tree.type !== MEMBER_LOOKUP_EXPRESSION)
+      return false;
+    return tree.operand.type === SUPER_EXPRESSION;
+  }
+  return {get SuperTransformer() {
+      return SuperTransformer;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/ClassTransformer", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/ClassTransformer";
+  var $__158 = Object.freeze(Object.defineProperties(["($traceurRuntime.createClass)(", ", ", ", ", ",\n                                       ", ")"], {raw: {value: Object.freeze(["($traceurRuntime.createClass)(", ", ", ", ", ",\n                                       ", ")"])}})),
+      $__159 = Object.freeze(Object.defineProperties(["($traceurRuntime.createClass)(", ", ", ", ", ")"], {raw: {value: Object.freeze(["($traceurRuntime.createClass)(", ", ", ", ", ")"])}})),
+      $__160 = Object.freeze(Object.defineProperties(["var ", " = ", ""], {raw: {value: Object.freeze(["var ", " = ", ""])}})),
+      $__161 = Object.freeze(Object.defineProperties(["var ", " = ", ""], {raw: {value: Object.freeze(["var ", " = ", ""])}})),
+      $__162 = Object.freeze(Object.defineProperties(["function($__super) {\n        var ", " = ", ";\n        return ($traceurRuntime.createClass)(", ", ", ",\n                                             ", ", $__super);\n      }(", ")"], {raw: {value: Object.freeze(["function($__super) {\n        var ", " = ", ";\n        return ($traceurRuntime.createClass)(", ", ", ",\n                                             ", ", $__super);\n      }(", ")"])}})),
+      $__163 = Object.freeze(Object.defineProperties(["function() {\n        var ", " = ", ";\n        return ($traceurRuntime.createClass)(", ", ", ",\n                                             ", ");\n      }()"], {raw: {value: Object.freeze(["function() {\n        var ", " = ", ";\n        return ($traceurRuntime.createClass)(", ", ", ",\n                                             ", ");\n      }()"])}})),
+      $__164 = Object.freeze(Object.defineProperties(["$traceurRuntime.defaultSuperCall(this,\n                ", ".prototype, arguments)"], {raw: {value: Object.freeze(["$traceurRuntime.defaultSuperCall(this,\n                ", ".prototype, arguments)"])}}));
+  var AlphaRenamer = System.get("traceur@0.0.32/src/codegeneration/AlphaRenamer").AlphaRenamer;
+  var CONSTRUCTOR = System.get("traceur@0.0.32/src/syntax/PredefinedName").CONSTRUCTOR;
+  var $__167 = System.get("traceur@0.0.32/src/syntax/trees/ParseTrees"),
+      AnonBlock = $__167.AnonBlock,
+      ExportDeclaration = $__167.ExportDeclaration,
+      FunctionExpression = $__167.FunctionExpression,
+      GetAccessor = $__167.GetAccessor,
+      PropertyMethodAssignment = $__167.PropertyMethodAssignment,
+      SetAccessor = $__167.SetAccessor;
+  var $__167 = System.get("traceur@0.0.32/src/syntax/trees/ParseTreeType"),
+      GET_ACCESSOR = $__167.GET_ACCESSOR,
+      PROPERTY_METHOD_ASSIGNMENT = $__167.PROPERTY_METHOD_ASSIGNMENT,
+      SET_ACCESSOR = $__167.SET_ACCESSOR;
+  var SuperTransformer = System.get("traceur@0.0.32/src/codegeneration/SuperTransformer").SuperTransformer;
+  var TempVarTransformer = System.get("traceur@0.0.32/src/codegeneration/TempVarTransformer").TempVarTransformer;
+  var VAR = System.get("traceur@0.0.32/src/syntax/TokenType").VAR;
+  var MakeStrictTransformer = System.get("traceur@0.0.32/src/codegeneration/MakeStrictTransformer").MakeStrictTransformer;
+  var $__167 = System.get("traceur@0.0.32/src/codegeneration/ParseTreeFactory"),
+      createEmptyParameterList = $__167.createEmptyParameterList,
+      createExpressionStatement = $__167.createExpressionStatement,
+      createFunctionBody = $__167.createFunctionBody,
+      id = $__167.createIdentifierExpression,
+      createMemberExpression = $__167.createMemberExpression,
+      createObjectLiteralExpression = $__167.createObjectLiteralExpression,
+      createParenExpression = $__167.createParenExpression,
+      createThisExpression = $__167.createThisExpression,
+      createVariableStatement = $__167.createVariableStatement;
+  var hasUseStrict = System.get("traceur@0.0.32/src/semantics/util").hasUseStrict;
+  var parseOptions = System.get("traceur@0.0.32/src/options").parseOptions;
+  var $__167 = System.get("traceur@0.0.32/src/codegeneration/PlaceholderParser"),
+      parseExpression = $__167.parseExpression,
+      parseStatement = $__167.parseStatement,
+      parseStatements = $__167.parseStatements;
+  var propName = System.get("traceur@0.0.32/src/staticsemantics/PropName").propName;
+  function classCall(func, object, staticObject, superClass) {
+    if (superClass) {
+      return parseExpression($__158, func, object, staticObject, superClass);
+    }
+    return parseExpression($__159, func, object, staticObject);
+  }
+  var ClassTransformer = function ClassTransformer(identifierGenerator) {
+    $traceurRuntime.superCall(this, $ClassTransformer.prototype, "constructor", [identifierGenerator]);
+    this.strictCount_ = 0;
+    this.state_ = null;
+  };
+  var $ClassTransformer = ClassTransformer;
+  ($traceurRuntime.createClass)(ClassTransformer, {
+    transformExportDeclaration: function(tree) {
+      var transformed = $traceurRuntime.superCall(this, $ClassTransformer.prototype, "transformExportDeclaration", [tree]);
+      if (transformed === tree)
+        return tree;
+      var declaration = transformed.declaration;
+      if (declaration instanceof AnonBlock) {
+        var statements = $traceurRuntime.spread([new ExportDeclaration(null, declaration.statements[0], [])], declaration.statements.slice(1));
+        return new AnonBlock(null, statements);
+      }
+      return transformed;
+    },
+    transformModule: function(tree) {
+      this.strictCount_ = 1;
+      return $traceurRuntime.superCall(this, $ClassTransformer.prototype, "transformModule", [tree]);
+    },
+    transformScript: function(tree) {
+      this.strictCount_ = +hasUseStrict(tree.scriptItemList);
+      return $traceurRuntime.superCall(this, $ClassTransformer.prototype, "transformScript", [tree]);
+    },
+    transformFunctionBody: function(tree) {
+      var useStrict = +hasUseStrict(tree.statements);
+      this.strictCount_ += useStrict;
+      var result = $traceurRuntime.superCall(this, $ClassTransformer.prototype, "transformFunctionBody", [tree]);
+      this.strictCount_ -= useStrict;
+      return result;
+    },
+    makeStrict_: function(tree) {
+      if (this.strictCount_)
+        return tree;
+      return MakeStrictTransformer.transformTree(tree);
+    },
+    transformClassElements_: function(tree, internalName) {
+      var $__165 = this;
+      var oldState = this.state_;
+      this.state_ = {hasSuper: false};
+      var superClass = this.transformAny(tree.superClass);
+      var hasConstructor = false;
+      var protoElements = [],
+          staticElements = [];
+      var constructorBody,
+          constructorParams;
+      tree.elements.forEach((function(tree) {
+        var elements,
+            homeObject;
+        if (tree.isStatic) {
+          elements = staticElements;
+          homeObject = internalName;
+        } else {
+          elements = protoElements;
+          homeObject = createMemberExpression(internalName, 'prototype');
+        }
+        switch (tree.type) {
+          case GET_ACCESSOR:
+            elements.push($__165.transformGetAccessor_(tree, homeObject));
+            break;
+          case SET_ACCESSOR:
+            elements.push($__165.transformSetAccessor_(tree, homeObject));
+            break;
+          case PROPERTY_METHOD_ASSIGNMENT:
+            var transformed = $__165.transformPropertyMethodAssignment_(tree, homeObject);
+            if (!tree.isStatic && propName(tree) === CONSTRUCTOR) {
+              hasConstructor = true;
+              constructorParams = transformed.formalParameterList;
+              constructorBody = transformed.functionBody;
+            } else {
+              elements.push(transformed);
+            }
+            break;
+          default:
+            throw new Error(("Unexpected class element: " + tree.type));
+        }
+      }));
+      var object = createObjectLiteralExpression(protoElements);
+      var staticObject = createObjectLiteralExpression(staticElements);
+      var func;
+      if (!hasConstructor) {
+        func = this.getDefaultConstructor_(tree, internalName);
+      } else {
+        func = new FunctionExpression(tree.location, tree.name, false, constructorParams, null, [], constructorBody);
+      }
+      var state = this.state_;
+      this.state_ = oldState;
+      return {
+        func: func,
+        superClass: superClass,
+        object: object,
+        staticObject: staticObject,
+        hasSuper: state.hasSuper
+      };
+    },
+    transformClassDeclaration: function(tree) {
+      var name = tree.name.identifierToken;
+      var internalName = id(("$" + name));
+      var renamed = AlphaRenamer.rename(tree, name.value, internalName.identifierToken.value);
+      var referencesClassName = renamed !== tree;
+      var tree = renamed;
+      var $__167 = this.transformClassElements_(tree, internalName),
+          func = $__167.func,
+          hasSuper = $__167.hasSuper,
+          object = $__167.object,
+          staticObject = $__167.staticObject,
+          superClass = $__167.superClass;
+      var statements = parseStatements($__160, name, func);
+      var expr = classCall(name, object, staticObject, superClass);
+      if (hasSuper || referencesClassName) {
+        statements.push(parseStatement($__161, internalName, name));
+      }
+      statements.push(createExpressionStatement(expr));
+      var anonBlock = new AnonBlock(null, statements);
+      return this.makeStrict_(anonBlock);
+    },
+    transformClassExpression: function(tree) {
+      this.pushTempVarState();
+      var name;
+      if (tree.name)
+        name = tree.name.identifierToken;
+      else
+        name = id(this.getTempIdentifier());
+      var $__167 = this.transformClassElements_(tree, name),
+          func = $__167.func,
+          hasSuper = $__167.hasSuper,
+          object = $__167.object,
+          staticObject = $__167.staticObject,
+          superClass = $__167.superClass;
+      var expression;
+      if (hasSuper) {
+        expression = parseExpression($__162, name, func, name, object, staticObject, superClass);
+      } else if (tree.name) {
+        expression = parseExpression($__163, name, func, name, object, staticObject);
+      } else {
+        expression = classCall(func, object, staticObject, superClass);
+      }
+      this.popTempVarState();
+      return createParenExpression(this.makeStrict_(expression));
+    },
+    transformPropertyMethodAssignment_: function(tree, internalName) {
+      var formalParameterList = this.transformAny(tree.formalParameterList);
+      var functionBody = this.transformSuperInFunctionBody_(tree, tree.functionBody, internalName);
+      if (!tree.isStatic && formalParameterList === tree.formalParameterList && functionBody === tree.functionBody) {
+        return tree;
+      }
+      var isStatic = false;
+      return new PropertyMethodAssignment(tree.location, isStatic, tree.isGenerator, tree.name, formalParameterList, tree.typeAnnotation, tree.annotations, functionBody);
+    },
+    transformGetAccessor_: function(tree, internalName) {
+      var body = this.transformSuperInFunctionBody_(tree, tree.body, internalName);
+      if (!tree.isStatic && body === tree.body)
+        return tree;
+      return new GetAccessor(tree.location, false, tree.name, tree.typeAnnotation, tree.annotations, body);
+    },
+    transformSetAccessor_: function(tree, internalName) {
+      var parameter = this.transformAny(tree.parameter);
+      var body = this.transformSuperInFunctionBody_(tree, tree.body, internalName);
+      if (!tree.isStatic && body === tree.body)
+        return tree;
+      return new SetAccessor(tree.location, false, tree.name, parameter, tree.annotations, body);
+    },
+    transformSuperInFunctionBody_: function(methodTree, tree, internalName) {
+      this.pushTempVarState();
+      var thisName = this.getTempIdentifier();
+      var thisDecl = createVariableStatement(VAR, thisName, createThisExpression());
+      var superTransformer = new SuperTransformer(this, internalName, methodTree, thisName);
+      var transformedTree = superTransformer.transformFunctionBody(this.transformFunctionBody(tree));
+      if (superTransformer.hasSuper)
+        this.state_.hasSuper = true;
+      this.popTempVarState();
+      if (superTransformer.nestedSuper)
+        return createFunctionBody([thisDecl].concat(transformedTree.statements));
+      return transformedTree;
+    },
+    getDefaultConstructor_: function(tree, internalName) {
+      var constructorParams = createEmptyParameterList();
+      var constructorBody;
+      if (tree.superClass) {
+        var statement = parseStatement($__164, internalName);
+        constructorBody = createFunctionBody([statement]);
+        this.state_.hasSuper = true;
+      } else {
+        constructorBody = createFunctionBody([]);
+      }
+      return new FunctionExpression(tree.location, tree.name, false, constructorParams, null, [], constructorBody);
+    }
+  }, {}, TempVarTransformer);
+  return {get ClassTransformer() {
+      return ClassTransformer;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/CommonJsModuleTransformer", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/CommonJsModuleTransformer";
+  var $__168 = Object.freeze(Object.defineProperties(["module.exports = function() {\n            ", "\n          }.call(", ");"], {raw: {value: Object.freeze(["module.exports = function() {\n            ", "\n          }.call(", ");"])}})),
+      $__169 = Object.freeze(Object.defineProperties(["module.exports = ", ";"], {raw: {value: Object.freeze(["module.exports = ", ";"])}})),
+      $__170 = Object.freeze(Object.defineProperties(["require(", ")"], {raw: {value: Object.freeze(["require(", ")"])}})),
+      $__171 = Object.freeze(Object.defineProperties(["__esModule: true"], {raw: {value: Object.freeze(["__esModule: true"])}}));
+  var ModuleTransformer = System.get("traceur@0.0.32/src/codegeneration/ModuleTransformer").ModuleTransformer;
+  var RETURN_STATEMENT = System.get("traceur@0.0.32/src/syntax/trees/ParseTreeType").RETURN_STATEMENT;
+  var assert = System.get("traceur@0.0.32/src/util/assert").assert;
+  var globalThis = System.get("traceur@0.0.32/src/codegeneration/globalThis").default;
+  var $__173 = System.get("traceur@0.0.32/src/codegeneration/PlaceholderParser"),
+      parseExpression = $__173.parseExpression,
+      parsePropertyDefinition = $__173.parsePropertyDefinition,
+      parseStatement = $__173.parseStatement,
+      parseStatements = $__173.parseStatements;
+  var scopeContainsThis = System.get("traceur@0.0.32/src/codegeneration/scopeContainsThis").default;
+  var CommonJsModuleTransformer = function CommonJsModuleTransformer() {
+    $traceurRuntime.defaultSuperCall(this, $CommonJsModuleTransformer.prototype, arguments);
+  };
+  var $CommonJsModuleTransformer = CommonJsModuleTransformer;
+  ($traceurRuntime.createClass)(CommonJsModuleTransformer, {
+    wrapModule: function(statements) {
+      var needsIife = statements.some(scopeContainsThis);
+      if (needsIife) {
+        return parseStatements($__168, statements, globalThis());
+      }
+      var last = statements[statements.length - 1];
+      statements = statements.slice(0, -1);
+      assert(last.type === RETURN_STATEMENT);
+      var exportObject = last.expression;
+      if (this.hasExports()) {
+        statements.push(parseStatement($__169, exportObject));
+      }
+      return statements;
+    },
+    transformModuleSpecifier: function(tree) {
+      return parseExpression($__170, tree.token);
+    },
+    getExportProperties: function() {
+      var properties = $traceurRuntime.superCall(this, $CommonJsModuleTransformer.prototype, "getExportProperties", []);
+      if (this.exportVisitor_.hasExports())
+        properties.push(parsePropertyDefinition($__171));
+      return properties;
+    }
+  }, {}, ModuleTransformer);
+  return {get CommonJsModuleTransformer() {
+      return CommonJsModuleTransformer;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/ParameterTransformer", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/ParameterTransformer";
+  var FunctionBody = System.get("traceur@0.0.32/src/syntax/trees/ParseTrees").FunctionBody;
+  var TempVarTransformer = System.get("traceur@0.0.32/src/codegeneration/TempVarTransformer").TempVarTransformer;
+  var prependStatements = System.get("traceur@0.0.32/src/codegeneration/PrependStatements").prependStatements;
+  var stack = [];
+  var ParameterTransformer = function ParameterTransformer() {
+    $traceurRuntime.defaultSuperCall(this, $ParameterTransformer.prototype, arguments);
+  };
+  var $ParameterTransformer = ParameterTransformer;
+  ($traceurRuntime.createClass)(ParameterTransformer, {
+    transformArrowFunctionExpression: function(tree) {
+      stack.push([]);
+      return $traceurRuntime.superCall(this, $ParameterTransformer.prototype, "transformArrowFunctionExpression", [tree]);
+    },
+    transformFunctionDeclaration: function(tree) {
+      stack.push([]);
+      return $traceurRuntime.superCall(this, $ParameterTransformer.prototype, "transformFunctionDeclaration", [tree]);
+    },
+    transformFunctionExpression: function(tree) {
+      stack.push([]);
+      return $traceurRuntime.superCall(this, $ParameterTransformer.prototype, "transformFunctionExpression", [tree]);
+    },
+    transformGetAccessor: function(tree) {
+      stack.push([]);
+      return $traceurRuntime.superCall(this, $ParameterTransformer.prototype, "transformGetAccessor", [tree]);
+    },
+    transformSetAccessor: function(tree) {
+      stack.push([]);
+      return $traceurRuntime.superCall(this, $ParameterTransformer.prototype, "transformSetAccessor", [tree]);
+    },
+    transformPropertyMethodAssignment: function(tree) {
+      stack.push([]);
+      return $traceurRuntime.superCall(this, $ParameterTransformer.prototype, "transformPropertyMethodAssignment", [tree]);
+    },
+    transformFunctionBody: function(tree) {
+      var transformedTree = $traceurRuntime.superCall(this, $ParameterTransformer.prototype, "transformFunctionBody", [tree]);
+      var statements = stack.pop();
+      if (!statements.length)
+        return transformedTree;
+      statements = prependStatements.apply(null, $traceurRuntime.spread([transformedTree.statements], statements));
+      return new FunctionBody(transformedTree.location, statements);
+    },
+    get parameterStatements() {
+      return stack[stack.length - 1];
+    }
+  }, {}, TempVarTransformer);
+  return {get ParameterTransformer() {
+      return ParameterTransformer;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/DefaultParametersTransformer", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/DefaultParametersTransformer";
+  var $__177 = System.get("traceur@0.0.32/src/semantics/util"),
+      isUndefined = $__177.isUndefined,
+      isVoidExpression = $__177.isVoidExpression;
+  var FormalParameterList = System.get("traceur@0.0.32/src/syntax/trees/ParseTrees").FormalParameterList;
+  var ParameterTransformer = System.get("traceur@0.0.32/src/codegeneration/ParameterTransformer").ParameterTransformer;
+  var ARGUMENTS = System.get("traceur@0.0.32/src/syntax/PredefinedName").ARGUMENTS;
+  var $__177 = System.get("traceur@0.0.32/src/syntax/trees/ParseTreeType"),
+      FORMAL_PARAMETER = $__177.FORMAL_PARAMETER,
+      REST_PARAMETER = $__177.REST_PARAMETER;
+  var $__177 = System.get("traceur@0.0.32/src/syntax/TokenType"),
+      NOT_EQUAL_EQUAL = $__177.NOT_EQUAL_EQUAL,
+      VAR = $__177.VAR;
+  var $__177 = System.get("traceur@0.0.32/src/codegeneration/ParseTreeFactory"),
+      createBinaryOperator = $__177.createBinaryOperator,
+      createConditionalExpression = $__177.createConditionalExpression,
+      createIdentifierExpression = $__177.createIdentifierExpression,
+      createMemberLookupExpression = $__177.createMemberLookupExpression,
+      createNumberLiteral = $__177.createNumberLiteral,
+      createOperatorToken = $__177.createOperatorToken,
+      createVariableStatement = $__177.createVariableStatement,
+      createVoid0 = $__177.createVoid0;
+  var prependStatements = System.get("traceur@0.0.32/src/codegeneration/PrependStatements").prependStatements;
+  function createDefaultAssignment(index, binding, initialiser) {
+    var argumentsExpression = createMemberLookupExpression(createIdentifierExpression(ARGUMENTS), createNumberLiteral(index));
+    var assignmentExpression;
+    if (initialiser === null || isUndefined(initialiser) || isVoidExpression(initialiser)) {
+      assignmentExpression = argumentsExpression;
+    } else {
+      assignmentExpression = createConditionalExpression(createBinaryOperator(argumentsExpression, createOperatorToken(NOT_EQUAL_EQUAL), createVoid0()), argumentsExpression, initialiser);
+    }
+    return createVariableStatement(VAR, binding, assignmentExpression);
+  }
+  var DefaultParametersTransformer = function DefaultParametersTransformer() {
+    $traceurRuntime.defaultSuperCall(this, $DefaultParametersTransformer.prototype, arguments);
+  };
+  var $DefaultParametersTransformer = DefaultParametersTransformer;
+  ($traceurRuntime.createClass)(DefaultParametersTransformer, {transformFormalParameterList: function(tree) {
+      var parameters = [];
+      var changed = false;
+      var defaultToUndefined = false;
+      for (var i = 0; i < tree.parameters.length; i++) {
+        var param = this.transformAny(tree.parameters[i]);
+        if (param !== tree.parameters[i])
+          changed = true;
+        if (param.isRestParameter() || !param.parameter.initialiser && !defaultToUndefined) {
+          parameters.push(param);
+        } else {
+          defaultToUndefined = true;
+          changed = true;
+          this.parameterStatements.push(createDefaultAssignment(i, param.parameter.binding, param.parameter.initialiser));
+        }
+      }
+      if (!changed)
+        return tree;
+      return new FormalParameterList(tree.location, parameters);
+    }}, {}, ParameterTransformer);
+  return {get DefaultParametersTransformer() {
+      return DefaultParametersTransformer;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/DestructuringTransformer", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/DestructuringTransformer";
+  var $__180 = System.get("traceur@0.0.32/src/syntax/PredefinedName"),
+      ARRAY = $__180.ARRAY,
+      CALL = $__180.CALL,
+      PROTOTYPE = $__180.PROTOTYPE,
+      SLICE = $__180.SLICE;
+  var $__180 = System.get("traceur@0.0.32/src/syntax/trees/ParseTreeType"),
+      ARRAY_LITERAL_EXPRESSION = $__180.ARRAY_LITERAL_EXPRESSION,
+      ARRAY_PATTERN = $__180.ARRAY_PATTERN,
+      BINDING_ELEMENT = $__180.BINDING_ELEMENT,
+      BINDING_IDENTIFIER = $__180.BINDING_IDENTIFIER,
+      BLOCK = $__180.BLOCK,
+      CALL_EXPRESSION = $__180.CALL_EXPRESSION,
+      COMPUTED_PROPERTY_NAME = $__180.COMPUTED_PROPERTY_NAME,
+      IDENTIFIER_EXPRESSION = $__180.IDENTIFIER_EXPRESSION,
+      LITERAL_EXPRESSION = $__180.LITERAL_EXPRESSION,
+      MEMBER_EXPRESSION = $__180.MEMBER_EXPRESSION,
+      MEMBER_LOOKUP_EXPRESSION = $__180.MEMBER_LOOKUP_EXPRESSION,
+      OBJECT_LITERAL_EXPRESSION = $__180.OBJECT_LITERAL_EXPRESSION,
+      OBJECT_PATTERN = $__180.OBJECT_PATTERN,
+      OBJECT_PATTERN_FIELD = $__180.OBJECT_PATTERN_FIELD,
+      PAREN_EXPRESSION = $__180.PAREN_EXPRESSION,
+      VARIABLE_DECLARATION_LIST = $__180.VARIABLE_DECLARATION_LIST;
+  var $__180 = System.get("traceur@0.0.32/src/syntax/trees/ParseTrees"),
+      BindingElement = $__180.BindingElement,
+      Catch = $__180.Catch,
+      ForInStatement = $__180.ForInStatement,
+      ForOfStatement = $__180.ForOfStatement,
+      LiteralExpression = $__180.LiteralExpression;
+  var ParameterTransformer = System.get("traceur@0.0.32/src/codegeneration/ParameterTransformer").ParameterTransformer;
+  var $__180 = System.get("traceur@0.0.32/src/syntax/TokenType"),
+      EQUAL = $__180.EQUAL,
+      IDENTIFIER = $__180.IDENTIFIER,
+      IN = $__180.IN,
+      LET = $__180.LET,
+      VAR = $__180.VAR;
+  var $__180 = System.get("traceur@0.0.32/src/codegeneration/ParseTreeFactory"),
+      createArgumentList = $__180.createArgumentList,
+      createAssignmentExpression = $__180.createAssignmentExpression,
+      createBinaryOperator = $__180.createBinaryOperator,
+      createBindingIdentifier = $__180.createBindingIdentifier,
+      createBlock = $__180.createBlock,
+      createCallExpression = $__180.createCallExpression,
+      createCommaExpression = $__180.createCommaExpression,
+      createConditionalExpression = $__180.createConditionalExpression,
+      createExpressionStatement = $__180.createExpressionStatement,
+      createIdentifierExpression = $__180.createIdentifierExpression,
+      createMemberExpression = $__180.createMemberExpression,
+      createMemberLookupExpression = $__180.createMemberLookupExpression,
+      createNumberLiteral = $__180.createNumberLiteral,
+      createOperatorToken = $__180.createOperatorToken,
+      createParenExpression = $__180.createParenExpression,
+      createStringLiteral = $__180.createStringLiteral,
+      createVariableDeclaration = $__180.createVariableDeclaration,
+      createVariableDeclarationList = $__180.createVariableDeclarationList,
+      createVariableStatement = $__180.createVariableStatement;
+  var options = System.get("traceur@0.0.32/src/options").options;
+  var Desugaring = function Desugaring(rvalue) {
+    this.rvalue = rvalue;
+  };
+  ($traceurRuntime.createClass)(Desugaring, {}, {});
+  var AssignmentExpressionDesugaring = function AssignmentExpressionDesugaring(rvalue) {
+    $traceurRuntime.superCall(this, $AssignmentExpressionDesugaring.prototype, "constructor", [rvalue]);
+    this.expressions = [];
+  };
+  var $AssignmentExpressionDesugaring = AssignmentExpressionDesugaring;
+  ($traceurRuntime.createClass)(AssignmentExpressionDesugaring, {assign: function(lvalue, rvalue) {
+      lvalue = lvalue instanceof BindingElement ? lvalue.binding : lvalue;
+      this.expressions.push(createAssignmentExpression(lvalue, rvalue));
+    }}, {}, Desugaring);
+  var VariableDeclarationDesugaring = function VariableDeclarationDesugaring(rvalue) {
+    $traceurRuntime.superCall(this, $VariableDeclarationDesugaring.prototype, "constructor", [rvalue]);
+    this.declarations = [];
+  };
+  var $VariableDeclarationDesugaring = VariableDeclarationDesugaring;
+  ($traceurRuntime.createClass)(VariableDeclarationDesugaring, {assign: function(lvalue, rvalue) {
+      if (lvalue instanceof BindingElement) {
+        this.declarations.push(createVariableDeclaration(lvalue.binding, rvalue));
+        return;
+      }
+      if (lvalue.type == IDENTIFIER_EXPRESSION)
+        lvalue = createBindingIdentifier(lvalue);
+      this.declarations.push(createVariableDeclaration(lvalue, rvalue));
+    }}, {}, Desugaring);
+  function createConditionalMemberExpression(rvalue, name, initialiser) {
+    if (name.type === COMPUTED_PROPERTY_NAME) {
+      return createConditionalMemberLookupExpression(rvalue, name.expression, initialiser);
+    }
+    var token;
+    if (name.type == BINDING_IDENTIFIER) {
+      token = name.identifierToken;
+    } else {
+      token = name.literalToken;
+      if (!token.isKeyword() && token.type !== IDENTIFIER) {
+        return createConditionalMemberLookupExpression(rvalue, new LiteralExpression(null, token), initialiser);
+      }
+    }
+    if (!initialiser)
+      return createMemberExpression(rvalue, token);
+    return createConditionalExpression(createBinaryOperator(createStringLiteral(token.toString()), createOperatorToken(IN), rvalue), createMemberExpression(rvalue, token), initialiser);
+  }
+  function createConditionalMemberLookupExpression(rvalue, index, initialiser) {
+    if (!initialiser)
+      return createMemberLookupExpression(rvalue, index);
+    return createConditionalExpression(createBinaryOperator(index, createOperatorToken(IN), rvalue), createMemberLookupExpression(rvalue, index), initialiser);
+  }
+  var DestructuringTransformer = function DestructuringTransformer() {
+    $traceurRuntime.defaultSuperCall(this, $DestructuringTransformer.prototype, arguments);
+  };
+  var $DestructuringTransformer = DestructuringTransformer;
+  ($traceurRuntime.createClass)(DestructuringTransformer, {
+    transformArrayPattern: function(tree) {
+      throw new Error('unreachable');
+    },
+    transformObjectPattern: function(tree) {
+      throw new Error('unreachable');
+    },
+    transformBinaryOperator: function(tree) {
+      if (tree.operator.type == EQUAL && tree.left.isPattern()) {
+        return this.transformAny(this.desugarAssignment_(tree.left, tree.right));
+      } else {
+        return $traceurRuntime.superCall(this, $DestructuringTransformer.prototype, "transformBinaryOperator", [tree]);
+      }
+    },
+    desugarAssignment_: function(lvalue, rvalue) {
+      var tempIdent = createIdentifierExpression(this.addTempVar());
+      var desugaring = new AssignmentExpressionDesugaring(tempIdent);
+      this.desugarPattern_(desugaring, lvalue);
+      desugaring.expressions.unshift(createAssignmentExpression(tempIdent, rvalue));
+      desugaring.expressions.push(tempIdent);
+      return createParenExpression(createCommaExpression(desugaring.expressions));
+    },
+    transformVariableDeclarationList: function(tree) {
+      var $__178 = this;
+      if (!this.destructuringInDeclaration_(tree)) {
+        return $traceurRuntime.superCall(this, $DestructuringTransformer.prototype, "transformVariableDeclarationList", [tree]);
+      }
+      this.pushTempVarState();
+      var desugaredDeclarations = [];
+      tree.declarations.forEach((function(declaration) {
+        var $__181;
+        if (declaration.lvalue.isPattern()) {
+          ($__181 = desugaredDeclarations).push.apply($__181, $traceurRuntime.toObject($__178.desugarVariableDeclaration_(declaration)));
+        } else {
+          desugaredDeclarations.push(declaration);
+        }
+      }));
+      var transformedTree = this.transformVariableDeclarationList(createVariableDeclarationList(tree.declarationType, desugaredDeclarations));
+      this.popTempVarState();
+      return transformedTree;
+    },
+    transformForInStatement: function(tree) {
+      return this.transformForInOrOf_(tree, $traceurRuntime.superGet(this, $DestructuringTransformer.prototype, "transformForInStatement"), ForInStatement);
+    },
+    transformForOfStatement: function(tree) {
+      return this.transformForInOrOf_(tree, $traceurRuntime.superGet(this, $DestructuringTransformer.prototype, "transformForOfStatement"), ForOfStatement);
+    },
+    transformForInOrOf_: function(tree, superMethod, constr) {
+      var $__181;
+      if (!tree.initialiser.isPattern() && (tree.initialiser.type !== VARIABLE_DECLARATION_LIST || !this.destructuringInDeclaration_(tree.initialiser))) {
+        return superMethod.call(this, tree);
+      }
+      this.pushTempVarState();
+      var declarationType,
+          lvalue;
+      if (tree.initialiser.isPattern()) {
+        declarationType = null;
+        lvalue = tree.initialiser;
+      } else {
+        declarationType = tree.initialiser.declarationType;
+        lvalue = tree.initialiser.declarations[0].lvalue;
+      }
+      var statements = [];
+      var binding = this.desugarBinding_(lvalue, statements, declarationType);
+      var initialiser = createVariableDeclarationList(VAR, binding, null);
+      var collection = this.transformAny(tree.collection);
+      var body = this.transformAny(tree.body);
+      if (body.type !== BLOCK)
+        body = createBlock(body);
+      ($__181 = statements).push.apply($__181, $traceurRuntime.toObject(body.statements));
+      body = createBlock(statements);
+      this.popTempVarState();
+      return new constr(tree.location, initialiser, collection, body);
+    },
+    transformBindingElement: function(tree) {
+      if (!tree.binding.isPattern() || tree.initialiser)
+        return tree;
+      var statements = this.parameterStatements;
+      var binding = this.desugarBinding_(tree.binding, statements, VAR);
+      return new BindingElement(null, binding, null);
+    },
+    transformCatch: function(tree) {
+      var $__181;
+      if (!tree.binding.isPattern())
+        return $traceurRuntime.superCall(this, $DestructuringTransformer.prototype, "transformCatch", [tree]);
+      var body = this.transformAny(tree.catchBody);
+      var statements = [];
+      var kind = options.blockBinding ? LET : VAR;
+      var binding = this.desugarBinding_(tree.binding, statements, kind);
+      ($__181 = statements).push.apply($__181, $traceurRuntime.toObject(body.statements));
+      return new Catch(tree.location, binding, createBlock(statements));
+    },
+    desugarBinding_: function(bindingTree, statements, declarationType) {
+      var varName = this.getTempIdentifier();
+      var binding = createBindingIdentifier(varName);
+      var idExpr = createIdentifierExpression(varName);
+      var desugaring;
+      if (declarationType === null)
+        desugaring = new AssignmentExpressionDesugaring(idExpr);
+      else
+        desugaring = new VariableDeclarationDesugaring(idExpr);
+      this.desugarPattern_(desugaring, bindingTree);
+      if (declarationType === null) {
+        statements.push(createExpressionStatement(createCommaExpression(desugaring.expressions)));
+      } else {
+        statements.push(createVariableStatement(this.transformVariableDeclarationList(createVariableDeclarationList(declarationType, desugaring.declarations))));
+      }
+      return binding;
+    },
+    destructuringInDeclaration_: function(tree) {
+      return tree.declarations.some((function(declaration) {
+        return declaration.lvalue.isPattern();
+      }));
+    },
+    desugarVariableDeclaration_: function(tree) {
+      var tempRValueName = this.getTempIdentifier();
+      var tempRValueIdent = createIdentifierExpression(tempRValueName);
+      var desugaring;
+      var initialiser;
+      switch (tree.initialiser.type) {
+        case ARRAY_LITERAL_EXPRESSION:
+        case CALL_EXPRESSION:
+        case IDENTIFIER_EXPRESSION:
+        case LITERAL_EXPRESSION:
+        case MEMBER_EXPRESSION:
+        case MEMBER_LOOKUP_EXPRESSION:
+        case OBJECT_LITERAL_EXPRESSION:
+        case PAREN_EXPRESSION:
+          initialiser = tree.initialiser;
+        default:
+          desugaring = new VariableDeclarationDesugaring(tempRValueIdent);
+          desugaring.assign(desugaring.rvalue, tree.initialiser);
+          var initialiserFound = this.desugarPattern_(desugaring, tree.lvalue);
+          if (initialiserFound || desugaring.declarations.length > 2)
+            return desugaring.declarations;
+          initialiser = initialiser || createParenExpression(tree.initialiser);
+          desugaring = new VariableDeclarationDesugaring(initialiser);
+          this.desugarPattern_(desugaring, tree.lvalue);
+          return desugaring.declarations;
+      }
+    },
+    desugarPattern_: function(desugaring, tree) {
+      var initialiserFound = false;
+      switch (tree.type) {
+        case ARRAY_PATTERN:
+          {
+            var pattern = tree;
+            for (var i = 0; i < pattern.elements.length; i++) {
+              var lvalue = pattern.elements[i];
+              if (lvalue === null) {
+                continue;
+              } else if (lvalue.isSpreadPatternElement()) {
+                desugaring.assign(lvalue.lvalue, createCallExpression(createMemberExpression(ARRAY, PROTOTYPE, SLICE, CALL), createArgumentList(desugaring.rvalue, createNumberLiteral(i))));
+              } else {
+                if (lvalue.initialiser)
+                  initialiserFound = true;
+                desugaring.assign(lvalue, createConditionalMemberLookupExpression(desugaring.rvalue, createNumberLiteral(i), lvalue.initialiser));
+              }
+            }
+            break;
+          }
+        case OBJECT_PATTERN:
+          {
+            var pattern = tree;
+            pattern.fields.forEach((function(field) {
+              var lookup;
+              switch (field.type) {
+                case BINDING_ELEMENT:
+                  if (field.initialiser)
+                    initialiserFound = true;
+                  lookup = createConditionalMemberExpression(desugaring.rvalue, field.binding, field.initialiser);
+                  desugaring.assign(createIdentifierExpression(field.binding), lookup);
+                  break;
+                case OBJECT_PATTERN_FIELD:
+                  if (field.element.initialiser)
+                    initialiserFound = true;
+                  var name = field.name;
+                  lookup = createConditionalMemberExpression(desugaring.rvalue, name, field.element.initialiser);
+                  desugaring.assign(field.element, lookup);
+                  break;
+                case IDENTIFIER_EXPRESSION:
+                  lookup = createMemberExpression(desugaring.rvalue, field.identifierToken);
+                  desugaring.assign(field, lookup);
+                  break;
+                default:
+                  throw Error('unreachable');
+              }
+            }));
+            break;
+          }
+        case PAREN_EXPRESSION:
+          return this.desugarPattern_(desugaring, tree.expression);
+        default:
+          throw new Error('unreachable');
+      }
+      if (desugaring instanceof VariableDeclarationDesugaring && desugaring.declarations.length === 0) {
+        desugaring.assign(createBindingIdentifier(this.getTempIdentifier()), desugaring.rvalue);
+      }
+      return initialiserFound;
+    }
+  }, {}, ParameterTransformer);
+  return {get DestructuringTransformer() {
+      return DestructuringTransformer;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/ForOfTransformer", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/ForOfTransformer";
+  var $__182 = Object.freeze(Object.defineProperties(["", " = ", ".value;"], {raw: {value: Object.freeze(["", " = ", ".value;"])}})),
+      $__183 = Object.freeze(Object.defineProperties(["\n        for (var ", " =\n                 ", "[Symbol.iterator](),\n                 ", ";\n             !(", " = ", ".next()).done; ) {\n          ", ";\n          ", ";\n        }"], {raw: {value: Object.freeze(["\n        for (var ", " =\n                 ", "[Symbol.iterator](),\n                 ", ";\n             !(", " = ", ".next()).done; ) {\n          ", ";\n          ", ";\n        }"])}}));
+  var VARIABLE_DECLARATION_LIST = System.get("traceur@0.0.32/src/syntax/trees/ParseTreeType").VARIABLE_DECLARATION_LIST;
+  var TempVarTransformer = System.get("traceur@0.0.32/src/codegeneration/TempVarTransformer").TempVarTransformer;
+  var $__185 = System.get("traceur@0.0.32/src/codegeneration/ParseTreeFactory"),
+      id = $__185.createIdentifierExpression,
+      createMemberExpression = $__185.createMemberExpression,
+      createVariableStatement = $__185.createVariableStatement;
+  var parseStatement = System.get("traceur@0.0.32/src/codegeneration/PlaceholderParser").parseStatement;
+  var ForOfTransformer = function ForOfTransformer() {
+    $traceurRuntime.defaultSuperCall(this, $ForOfTransformer.prototype, arguments);
+  };
+  var $ForOfTransformer = ForOfTransformer;
+  ($traceurRuntime.createClass)(ForOfTransformer, {transformForOfStatement: function(original) {
+      var tree = $traceurRuntime.superCall(this, $ForOfTransformer.prototype, "transformForOfStatement", [original]);
+      var iter = id(this.getTempIdentifier());
+      var result = id(this.getTempIdentifier());
+      var assignment;
+      if (tree.initialiser.type === VARIABLE_DECLARATION_LIST) {
+        assignment = createVariableStatement(tree.initialiser.declarationType, tree.initialiser.declarations[0].lvalue, createMemberExpression(result, 'value'));
+      } else {
+        assignment = parseStatement($__182, tree.initialiser, result);
+      }
+      return parseStatement($__183, iter, tree.collection, result, result, iter, assignment, tree.body);
+    }}, {}, TempVarTransformer);
+  return {get ForOfTransformer() {
+      return ForOfTransformer;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/GeneratorComprehensionTransformer", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/GeneratorComprehensionTransformer";
+  var ComprehensionTransformer = System.get("traceur@0.0.32/src/codegeneration/ComprehensionTransformer").ComprehensionTransformer;
+  var createYieldStatement = System.get("traceur@0.0.32/src/codegeneration/ParseTreeFactory").createYieldStatement;
+  var GeneratorComprehensionTransformer = function GeneratorComprehensionTransformer() {
+    $traceurRuntime.defaultSuperCall(this, $GeneratorComprehensionTransformer.prototype, arguments);
+  };
+  var $GeneratorComprehensionTransformer = GeneratorComprehensionTransformer;
+  ($traceurRuntime.createClass)(GeneratorComprehensionTransformer, {transformGeneratorComprehension: function(tree) {
+      var expression = this.transformAny(tree.expression);
+      var statement = createYieldStatement(expression);
+      var isGenerator = true;
+      return this.transformComprehension(tree, statement, isGenerator);
+    }}, {}, ComprehensionTransformer);
+  return {get GeneratorComprehensionTransformer() {
+      return GeneratorComprehensionTransformer;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/generator/State", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/generator/State";
+  var $__188 = Object.freeze(Object.defineProperties(["$ctx.finallyFallThrough = ", ""], {raw: {value: Object.freeze(["$ctx.finallyFallThrough = ", ""])}}));
+  var $__190 = System.get("traceur@0.0.32/src/codegeneration/ParseTreeFactory"),
+      createAssignStateStatement = $__190.createAssignStateStatement,
+      createAssignmentStatement = $__190.createAssignmentStatement,
+      createBreakStatement = $__190.createBreakStatement,
+      createCaseClause = $__190.createCaseClause,
+      createIdentifierExpression = $__190.createIdentifierExpression,
+      createNumberLiteral = $__190.createNumberLiteral,
+      createStatementList = $__190.createStatementList;
+  var parseStatement = System.get("traceur@0.0.32/src/codegeneration/PlaceholderParser").parseStatement;
+  var State = function State(id) {
+    this.id = id;
+  };
+  ($traceurRuntime.createClass)(State, {
+    transformMachineState: function(enclosingFinally, machineEndState, reporter) {
+      return createCaseClause(createNumberLiteral(this.id), this.transform(enclosingFinally, machineEndState, reporter));
+    },
+    transformBreak: function(labelSet, breakState) {
+      return this;
+    },
+    transformBreakOrContinue: function(labelSet) {
+      var breakState = arguments[1];
+      var continueState = arguments[2];
+      return this;
+    }
+  }, {});
+  State.START_STATE = 0;
+  State.INVALID_STATE = -1;
+  State.END_STATE = -2;
+  State.RETHROW_STATE = -3;
+  State.generateJump = function(enclosingFinally, fallThroughState) {
+    return createStatementList(State.generateAssignState(enclosingFinally, fallThroughState), createBreakStatement());
+  };
+  State.generateAssignState = function(enclosingFinally, fallThroughState) {
+    var assignState;
+    if (State.isFinallyExit(enclosingFinally, fallThroughState)) {
+      assignState = generateAssignStateOutOfFinally(enclosingFinally, fallThroughState);
+    } else {
+      assignState = createStatementList(createAssignStateStatement(fallThroughState));
+    }
+    return assignState;
+  };
+  State.isFinallyExit = function(enclosingFinally, destination) {
+    return enclosingFinally != null && enclosingFinally.tryStates.indexOf(destination) < 0;
+  };
+  function generateAssignStateOutOfFinally(enclosingFinally, destination) {
+    var finallyState = enclosingFinally.finallyState;
+    return createStatementList(createAssignStateStatement(finallyState), parseStatement($__188, destination));
+  }
+  State.replaceStateList = function(oldStates, oldState, newState) {
+    var states = [];
+    for (var i = 0; i < oldStates.length; i++) {
+      states.push(State.replaceStateId(oldStates[i], oldState, newState));
+    }
+    return states;
+  };
+  State.replaceStateId = function(current, oldState, newState) {
+    return current == oldState ? newState : current;
+  };
+  State.replaceAllStates = function(exceptionBlocks, oldState, newState) {
+    var result = [];
+    for (var i = 0; i < exceptionBlocks.length; i++) {
+      result.push(exceptionBlocks[i].replaceState(oldState, newState));
+    }
+    return result;
+  };
+  return {get State() {
+      return State;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/generator/TryState", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/generator/TryState";
+  var State = System.get("traceur@0.0.32/src/codegeneration/generator/State").State;
+  var Kind = {
+    CATCH: 'catch',
+    FINALLY: 'finally'
+  };
+  var TryState = function TryState(kind, tryStates, nestedTrys) {
+    this.kind = kind;
+    this.tryStates = tryStates;
+    this.nestedTrys = nestedTrys;
+  };
+  ($traceurRuntime.createClass)(TryState, {
+    replaceAllStates: function(oldState, newState) {
+      return State.replaceStateList(this.tryStates, oldState, newState);
+    },
+    replaceNestedTrys: function(oldState, newState) {
+      var states = [];
+      for (var i = 0; i < this.nestedTrys.length; i++) {
+        states.push(this.nestedTrys[i].replaceState(oldState, newState));
+      }
+      return states;
+    }
+  }, {});
+  TryState.Kind = Kind;
+  return {get TryState() {
+      return TryState;
+    }};
+});
+System.register("traceur@0.0.32/src/syntax/trees/StateMachine", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/syntax/trees/StateMachine";
+  var ParseTree = System.get("traceur@0.0.32/src/syntax/trees/ParseTree").ParseTree;
+  var STATE_MACHINE = System.get("traceur@0.0.32/src/syntax/trees/ParseTreeType").STATE_MACHINE;
+  var State = System.get("traceur@0.0.32/src/codegeneration/generator/State").State;
+  var TryState = System.get("traceur@0.0.32/src/codegeneration/generator/TryState").TryState;
+  function addCatchOrFinallyStates(kind, enclosingMap, tryStates) {
+    for (var i = 0; i < tryStates.length; i++) {
+      var tryState = tryStates[i];
+      if (tryState.kind == kind) {
+        for (var j = 0; j < tryState.tryStates.length; j++) {
+          var id = tryState.tryStates[j];
+          enclosingMap[id] = tryState;
+        }
+      }
+      addCatchOrFinallyStates(kind, enclosingMap, tryState.nestedTrys);
+    }
+  }
+  function addAllCatchStates(tryStates, catches) {
+    for (var i = 0; i < tryStates.length; i++) {
+      var tryState = tryStates[i];
+      if (tryState.kind == TryState.Kind.CATCH) {
+        catches.push(tryState);
+      }
+      addAllCatchStates(tryState.nestedTrys, catches);
+    }
+  }
+  var StateMachine = function StateMachine(startState, fallThroughState, states, exceptionBlocks) {
+    this.location = null;
+    this.startState = startState;
+    this.fallThroughState = fallThroughState;
+    this.states = states;
+    this.exceptionBlocks = exceptionBlocks;
+  };
+  var $StateMachine = StateMachine;
+  ($traceurRuntime.createClass)(StateMachine, {
+    get type() {
+      return STATE_MACHINE;
+    },
+    transform: function(transformer) {
+      return transformer.transformStateMachine(this);
+    },
+    visit: function(visitor) {
+      visitor.visitStateMachine(this);
+    },
+    getAllStateIDs: function() {
+      var result = [];
+      for (var i = 0; i < this.states.length; i++) {
+        result.push(this.states[i].id);
+      }
+      return result;
+    },
+    getEnclosingFinallyMap: function() {
+      var enclosingMap = Object.create(null);
+      addCatchOrFinallyStates(TryState.Kind.FINALLY, enclosingMap, this.exceptionBlocks);
+      return enclosingMap;
+    },
+    allCatchStates: function() {
+      var catches = [];
+      addAllCatchStates(this.exceptionBlocks, catches);
+      return catches;
+    },
+    replaceStateId: function(oldState, newState) {
+      return new $StateMachine(State.replaceStateId(this.startState, oldState, newState), State.replaceStateId(this.fallThroughState, oldState, newState), State.replaceAllStates(this.states, oldState, newState), State.replaceAllStates(this.exceptionBlocks, oldState, newState));
+    },
+    replaceStartState: function(newState) {
+      return this.replaceStateId(this.startState, newState);
+    },
+    replaceFallThroughState: function(newState) {
+      return this.replaceStateId(this.fallThroughState, newState);
+    },
+    append: function(nextMachine) {
+      var states = $traceurRuntime.spread(this.states);
+      for (var i = 0; i < nextMachine.states.length; i++) {
+        var otherState = nextMachine.states[i];
+        states.push(otherState.replaceState(nextMachine.startState, this.fallThroughState));
+      }
+      var exceptionBlocks = $traceurRuntime.spread(this.exceptionBlocks);
+      for (var i = 0; i < nextMachine.exceptionBlocks.length; i++) {
+        var tryState = nextMachine.exceptionBlocks[i];
+        exceptionBlocks.push(tryState.replaceState(nextMachine.startState, this.fallThroughState));
+      }
+      return new $StateMachine(this.startState, nextMachine.fallThroughState, states, exceptionBlocks);
+    }
+  }, {}, ParseTree);
+  return {get StateMachine() {
+      return StateMachine;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/generator/AwaitState", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/generator/AwaitState";
+  var $__195 = Object.freeze(Object.defineProperties(["(", ").then($ctx.createCallback(", "),\n                                     $ctx.createErrback(", "));\n          return"], {raw: {value: Object.freeze(["(", ").then($ctx.createCallback(", "),\n                                     $ctx.createErrback(", "));\n          return"])}}));
+  var State = System.get("traceur@0.0.32/src/codegeneration/generator/State").State;
+  var parseStatements = System.get("traceur@0.0.32/src/codegeneration/PlaceholderParser").parseStatements;
+  var AwaitState = function AwaitState(id, callbackState, errbackState, expression) {
+    $traceurRuntime.superCall(this, $AwaitState.prototype, "constructor", [id]), this.callbackState = callbackState;
+    this.errbackState = errbackState;
+    this.expression = expression;
+    this.statements_ = null;
+  };
+  var $AwaitState = AwaitState;
+  ($traceurRuntime.createClass)(AwaitState, {
+    get statements() {
+      if (!this.statements_) {
+        this.statements_ = parseStatements($__195, this.expression, this.callbackState, this.errbackState);
+      }
+      return this.statements_;
+    },
+    replaceState: function(oldState, newState) {
+      return new $AwaitState(State.replaceStateId(this.id, oldState, newState), State.replaceStateId(this.callbackState, oldState, newState), State.replaceStateId(this.errbackState, oldState, newState), this.expression);
+    },
+    transform: function(enclosingFinally, machineEndState, reporter) {
+      return this.statements;
+    }
+  }, {}, State);
+  return {get AwaitState() {
+      return AwaitState;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/HoistVariablesTransformer", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/HoistVariablesTransformer";
+  var $__199 = System.get("traceur@0.0.32/src/syntax/trees/ParseTrees"),
+      AnonBlock = $__199.AnonBlock,
+      FunctionBody = $__199.FunctionBody,
+      ForInStatement = $__199.ForInStatement,
+      ForOfStatement = $__199.ForOfStatement,
+      VariableDeclarationList = $__199.VariableDeclarationList,
+      VariableStatement = $__199.VariableStatement;
+  var $__199 = System.get("traceur@0.0.32/src/syntax/trees/ParseTreeType"),
+      BINDING_IDENTIFIER = $__199.BINDING_IDENTIFIER,
+      VARIABLE_DECLARATION_LIST = $__199.VARIABLE_DECLARATION_LIST;
+  var ParseTreeTransformer = System.get("traceur@0.0.32/src/codegeneration/ParseTreeTransformer").ParseTreeTransformer;
+  var VAR = System.get("traceur@0.0.32/src/syntax/TokenType").VAR;
+  var assert = System.get("traceur@0.0.32/src/util/assert").assert;
+  var $__199 = System.get("traceur@0.0.32/src/codegeneration/ParseTreeFactory"),
+      createAssignmentExpression = $__199.createAssignmentExpression,
+      createCommaExpression = $__199.createCommaExpression,
+      createExpressionStatement = $__199.createExpressionStatement,
+      id = $__199.createIdentifierExpression,
+      createVariableDeclaration = $__199.createVariableDeclaration;
+  var prependStatements = System.get("traceur@0.0.32/src/codegeneration/PrependStatements").prependStatements;
+  var HoistVariablesTransformer = function HoistVariablesTransformer() {
+    $traceurRuntime.superCall(this, $HoistVariablesTransformer.prototype, "constructor", []);
+    this.hoistedVariables_ = Object.create(null);
+  };
+  var $HoistVariablesTransformer = HoistVariablesTransformer;
+  ($traceurRuntime.createClass)(HoistVariablesTransformer, {
+    transformFunctionBody: function(tree) {
+      var statements = this.transformList(tree.statements);
+      if (statements === tree.statements)
+        return tree;
+      var prepended = this.prependVariables(statements);
+      return new FunctionBody(tree.location, prepended);
+    },
+    addVariable: function(name) {
+      this.hoistedVariables_[name] = true;
+    },
+    hasVariables: function() {
+      for (var key in this.hoistedVariables_) {
+        return true;
+      }
+      return false;
+    },
+    getVariableNames: function() {
+      return Object.keys(this.hoistedVariables_);
+    },
+    getVariableStatement: function() {
+      if (!this.hasVariables())
+        return null;
+      var declarations = this.getVariableNames().map((function(name) {
+        return createVariableDeclaration(name, null);
+      }));
+      return new VariableStatement(null, new VariableDeclarationList(null, VAR, declarations));
+    },
+    prependVariables: function(statements) {
+      if (!this.hasVariables())
+        return statements;
+      return prependStatements(statements, this.getVariableStatement());
+    },
+    transformVariableStatement: function(tree) {
+      var declarations = this.transformAny(tree.declarations);
+      if (declarations == tree.declarations)
+        return tree;
+      if (declarations === null)
+        return new AnonBlock(null, []);
+      if (declarations.type === VARIABLE_DECLARATION_LIST)
+        return new VariableStatement(tree.location, declarations);
+      return createExpressionStatement(declarations);
+    },
+    transformVariableDeclarationList: function(tree) {
+      if (tree.declarationType == VAR) {
+        var expressions = [];
+        var declarations = this.transformList(tree.declarations);
+        for (var i = 0; i < declarations.length; i++) {
+          var declaration = declarations[i];
+          assert(declaration.lvalue.type === BINDING_IDENTIFIER);
+          var idToken = declaration.lvalue.identifierToken;
+          this.addVariable(idToken.value);
+          if (declaration.initialiser !== null) {
+            expressions.push(createAssignmentExpression(id(idToken), declaration.initialiser));
+          }
+        }
+        if (expressions.length === 0)
+          return null;
+        if (expressions.length == 1)
+          return expressions[0];
+        return createCommaExpression(expressions);
+      }
+      return $traceurRuntime.superCall(this, $HoistVariablesTransformer.prototype, "transformVariableDeclarationList", [tree]);
+    },
+    transformForInStatement: function(tree) {
+      return this.transformLoop_(tree, ForInStatement);
+    },
+    transformForOfStatement: function(tree) {
+      return this.transformLoop_(tree, ForOfStatement);
+    },
+    transformLoop_: function(tree, ctor) {
+      var initialiser = this.transformLoopIninitaliser_(tree.initialiser);
+      var collection = this.transformAny(tree.collection);
+      var body = this.transformAny(tree.body);
+      if (initialiser === tree.initialiser && collection === tree.collection && body === tree.body) {
+        return tree;
+      }
+      return new ctor(tree.location, initialiser, collection, body);
+    },
+    transformLoopIninitaliser_: function(tree) {
+      if (tree.type !== VARIABLE_DECLARATION_LIST)
+        return tree;
+      var token = tree.declarations[0].lvalue.identifierToken;
+      this.addVariable(token.value);
+      return id(token);
+    },
+    addMachineVariable: function(name) {
+      this.machineVariables_[name] = true;
+    },
+    transformFunctionDeclaration: function(tree) {
+      return tree;
+    },
+    transformFunctionExpression: function(tree) {
+      return tree;
+    },
+    transformGetAccessor: function(tree) {
+      return tree;
+    },
+    transformSetAccessor: function(tree) {
+      return tree;
+    }
+  }, {}, ParseTreeTransformer);
+  var $__default = HoistVariablesTransformer;
+  return {get default() {
+      return $__default;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/generator/FallThroughState", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/generator/FallThroughState";
+  var State = System.get("traceur@0.0.32/src/codegeneration/generator/State").State;
+  var FallThroughState = function FallThroughState(id, fallThroughState, statements) {
+    $traceurRuntime.superCall(this, $FallThroughState.prototype, "constructor", [id]);
+    this.fallThroughState = fallThroughState;
+    this.statements = statements;
+  };
+  var $FallThroughState = FallThroughState;
+  ($traceurRuntime.createClass)(FallThroughState, {
+    replaceState: function(oldState, newState) {
+      return new $FallThroughState(State.replaceStateId(this.id, oldState, newState), State.replaceStateId(this.fallThroughState, oldState, newState), this.statements);
+    },
+    transform: function(enclosingFinally, machineEndState, reporter) {
+      return $traceurRuntime.spread(this.statements, State.generateJump(enclosingFinally, this.fallThroughState));
+    }
+  }, {}, State);
+  return {get FallThroughState() {
+      return FallThroughState;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/generator/BreakState", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/generator/BreakState";
+  var FallThroughState = System.get("traceur@0.0.32/src/codegeneration/generator/FallThroughState").FallThroughState;
+  var State = System.get("traceur@0.0.32/src/codegeneration/generator/State").State;
+  var createStatementList = System.get("traceur@0.0.32/src/codegeneration/ParseTreeFactory").createStatementList;
+  var BreakState = function BreakState(id, label) {
+    $traceurRuntime.superCall(this, $BreakState.prototype, "constructor", [id]);
+    this.label = label;
+  };
+  var $BreakState = BreakState;
+  ($traceurRuntime.createClass)(BreakState, {
+    replaceState: function(oldState, newState) {
+      return new $BreakState(State.replaceStateId(this.id, oldState, newState), this.label);
+    },
+    transform: function(enclosingFinally, machineEndState, reporter) {
+      throw new Error('These should be removed before the transform step');
+    },
+    transformBreak: function(labelSet) {
+      var breakState = arguments[1];
+      if (this.label == null)
+        return new FallThroughState(this.id, breakState, []);
+      if (this.label in labelSet) {
+        return new FallThroughState(this.id, labelSet[this.label].fallThroughState, []);
+      }
+      return this;
+    },
+    transformBreakOrContinue: function(labelSet) {
+      var breakState = arguments[1];
+      var continueState = arguments[2];
+      return this.transformBreak(labelSet, breakState);
+    }
+  }, {}, State);
+  return {get BreakState() {
+      return BreakState;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/generator/ContinueState", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/generator/ContinueState";
+  var FallThroughState = System.get("traceur@0.0.32/src/codegeneration/generator/FallThroughState").FallThroughState;
+  var State = System.get("traceur@0.0.32/src/codegeneration/generator/State").State;
+  var createStatementList = System.get("traceur@0.0.32/src/codegeneration/ParseTreeFactory").createStatementList;
+  var ContinueState = function ContinueState(id, label) {
+    $traceurRuntime.superCall(this, $ContinueState.prototype, "constructor", [id]);
+    this.label = label;
+  };
+  var $ContinueState = ContinueState;
+  ($traceurRuntime.createClass)(ContinueState, {
+    replaceState: function(oldState, newState) {
+      return new $ContinueState(State.replaceStateId(this.id, oldState, newState), this.label);
+    },
+    transform: function(enclosingFinally, machineEndState, reporter) {
+      throw new Error('These should be removed before the transform step');
+    },
+    transformBreakOrContinue: function(labelSet) {
+      var breakState = arguments[1];
+      var continueState = arguments[2];
+      if (this.label == null)
+        return new FallThroughState(this.id, continueState, []);
+      if (this.label in labelSet) {
+        return new FallThroughState(this.id, labelSet[this.label].continueState, []);
+      }
+      return this;
+    }
+  }, {}, State);
+  return {get ContinueState() {
+      return ContinueState;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/generator/BreakContinueTransformer", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/generator/BreakContinueTransformer";
+  var BreakState = System.get("traceur@0.0.32/src/codegeneration/generator/BreakState").BreakState;
+  var ContinueState = System.get("traceur@0.0.32/src/codegeneration/generator/ContinueState").ContinueState;
+  var ParseTreeTransformer = System.get("traceur@0.0.32/src/codegeneration/ParseTreeTransformer").ParseTreeTransformer;
+  var StateMachine = System.get("traceur@0.0.32/src/syntax/trees/StateMachine").StateMachine;
+  function safeGetLabel(tree) {
+    return tree.name ? tree.name.value : null;
+  }
+  var BreakContinueTransformer = function BreakContinueTransformer(stateAllocator) {
+    $traceurRuntime.superCall(this, $BreakContinueTransformer.prototype, "constructor", []);
+    this.transformBreaks_ = true;
+    this.stateAllocator_ = stateAllocator;
+  };
+  var $BreakContinueTransformer = BreakContinueTransformer;
+  ($traceurRuntime.createClass)(BreakContinueTransformer, {
+    allocateState_: function() {
+      return this.stateAllocator_.allocateState();
+    },
+    stateToStateMachine_: function(newState) {
+      var fallThroughState = this.allocateState_();
+      return new StateMachine(newState.id, fallThroughState, [newState], []);
+    },
+    transformBreakStatement: function(tree) {
+      return this.transformBreaks_ || tree.name ? this.stateToStateMachine_(new BreakState(this.allocateState_(), safeGetLabel(tree))) : tree;
+    },
+    transformContinueStatement: function(tree) {
+      return this.stateToStateMachine_(new ContinueState(this.allocateState_(), safeGetLabel(tree)));
+    },
+    transformDoWhileStatement: function(tree) {
+      return tree;
+    },
+    transformForOfStatement: function(tree) {
+      return tree;
+    },
+    transformForStatement: function(tree) {
+      return tree;
+    },
+    transformFunctionDeclaration: function(tree) {
+      return tree;
+    },
+    transformFunctionExpression: function(tree) {
+      return tree;
+    },
+    transformStateMachine: function(tree) {
+      return tree;
+    },
+    transformSwitchStatement: function(tree) {
+      var oldState = this.transformBreaks_;
+      this.transformBreaks_ = false;
+      var result = $traceurRuntime.superCall(this, $BreakContinueTransformer.prototype, "transformSwitchStatement", [tree]);
+      this.transformBreaks_ = oldState;
+      return result;
+    },
+    transformWhileStatement: function(tree) {
+      return tree;
+    }
+  }, {}, ParseTreeTransformer);
+  return {get BreakContinueTransformer() {
+      return BreakContinueTransformer;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/generator/CatchState", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/generator/CatchState";
+  var State = System.get("traceur@0.0.32/src/codegeneration/generator/State").State;
+  var TryState = System.get("traceur@0.0.32/src/codegeneration/generator/TryState").TryState;
+  var CatchState = function CatchState(identifier, catchState, fallThroughState, allStates, nestedTrys) {
+    $traceurRuntime.superCall(this, $CatchState.prototype, "constructor", [TryState.Kind.CATCH, allStates, nestedTrys]);
+    this.identifier = identifier;
+    this.catchState = catchState;
+    this.fallThroughState = fallThroughState;
+  };
+  var $CatchState = CatchState;
+  ($traceurRuntime.createClass)(CatchState, {replaceState: function(oldState, newState) {
+      return new $CatchState(this.identifier, State.replaceStateId(this.catchState, oldState, newState), State.replaceStateId(this.fallThroughState, oldState, newState), this.replaceAllStates(oldState, newState), this.replaceNestedTrys(oldState, newState));
+    }}, {}, TryState);
+  return {get CatchState() {
+      return CatchState;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/generator/ConditionalState", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/generator/ConditionalState";
+  var $__210 = Object.freeze(Object.defineProperties(["$ctx.state = (", ") ? ", " : ", ";\n        break"], {raw: {value: Object.freeze(["$ctx.state = (", ") ? ", " : ", ";\n        break"])}}));
+  var State = System.get("traceur@0.0.32/src/codegeneration/generator/State").State;
+  var $__212 = System.get("traceur@0.0.32/src/codegeneration/ParseTreeFactory"),
+      createBlock = $__212.createBlock,
+      createIfStatement = $__212.createIfStatement;
+  var parseStatements = System.get("traceur@0.0.32/src/codegeneration/PlaceholderParser").parseStatements;
+  var ConditionalState = function ConditionalState(id, ifState, elseState, condition) {
+    $traceurRuntime.superCall(this, $ConditionalState.prototype, "constructor", [id]);
+    this.ifState = ifState;
+    this.elseState = elseState;
+    this.condition = condition;
+  };
+  var $ConditionalState = ConditionalState;
+  ($traceurRuntime.createClass)(ConditionalState, {
+    replaceState: function(oldState, newState) {
+      return new $ConditionalState(State.replaceStateId(this.id, oldState, newState), State.replaceStateId(this.ifState, oldState, newState), State.replaceStateId(this.elseState, oldState, newState), this.condition);
+    },
+    transform: function(enclosingFinally, machineEndState, reporter) {
+      if (State.isFinallyExit(enclosingFinally, this.ifState) || State.isFinallyExit(enclosingFinally, this.elseState)) {
+        return [createIfStatement(this.condition, createBlock(State.generateJump(enclosingFinally, this.ifState)), createBlock(State.generateJump(enclosingFinally, this.elseState)))];
+      }
+      return parseStatements($__210, this.condition, this.ifState, this.elseState);
+    }
+  }, {}, State);
+  return {get ConditionalState() {
+      return ConditionalState;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/generator/FinallyFallThroughState", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/generator/FinallyFallThroughState";
+  var State = System.get("traceur@0.0.32/src/codegeneration/generator/State").State;
+  var FinallyFallThroughState = function FinallyFallThroughState() {
+    $traceurRuntime.defaultSuperCall(this, $FinallyFallThroughState.prototype, arguments);
+  };
+  var $FinallyFallThroughState = FinallyFallThroughState;
+  ($traceurRuntime.createClass)(FinallyFallThroughState, {
+    replaceState: function(oldState, newState) {
+      return new $FinallyFallThroughState(State.replaceStateId(this.id, oldState, newState));
+    },
+    transformMachineState: function(enclosingFinally, machineEndState, reporter) {
+      return null;
+    },
+    transform: function(enclosingFinally, machineEndState, reporter) {
+      throw new Error('these are generated in addFinallyFallThroughDispatches');
+    }
+  }, {}, State);
+  return {get FinallyFallThroughState() {
+      return FinallyFallThroughState;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/generator/FinallyState", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/generator/FinallyState";
+  var State = System.get("traceur@0.0.32/src/codegeneration/generator/State").State;
+  var TryState = System.get("traceur@0.0.32/src/codegeneration/generator/TryState").TryState;
+  var FinallyState = function FinallyState(finallyState, fallThroughState, allStates, nestedTrys) {
+    $traceurRuntime.superCall(this, $FinallyState.prototype, "constructor", [TryState.Kind.FINALLY, allStates, nestedTrys]);
+    this.finallyState = finallyState;
+    this.fallThroughState = fallThroughState;
+  };
+  var $FinallyState = FinallyState;
+  ($traceurRuntime.createClass)(FinallyState, {replaceState: function(oldState, newState) {
+      return new $FinallyState(State.replaceStateId(this.finallyState, oldState, newState), State.replaceStateId(this.fallThroughState, oldState, newState), this.replaceAllStates(oldState, newState), this.replaceNestedTrys(oldState, newState));
+    }}, {}, TryState);
+  return {get FinallyState() {
+      return FinallyState;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/generator/StateAllocator", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/generator/StateAllocator";
+  var State = System.get("traceur@0.0.32/src/codegeneration/generator/State").State;
+  var StateAllocator = function StateAllocator() {
+    this.nextState_ = State.START_STATE + 1;
+  };
+  ($traceurRuntime.createClass)(StateAllocator, {allocateState: function() {
+      return this.nextState_++;
+    }}, {});
+  return {get StateAllocator() {
+      return StateAllocator;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/generator/SwitchState", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/generator/SwitchState";
+  var $__220 = System.get("traceur@0.0.32/src/syntax/trees/ParseTrees"),
+      CaseClause = $__220.CaseClause,
+      DefaultClause = $__220.DefaultClause,
+      SwitchStatement = $__220.SwitchStatement;
+  var State = System.get("traceur@0.0.32/src/codegeneration/generator/State").State;
+  var $__220 = System.get("traceur@0.0.32/src/codegeneration/ParseTreeFactory"),
+      createBreakStatement = $__220.createBreakStatement,
+      createStatementList = $__220.createStatementList;
+  var SwitchClause = function SwitchClause(first, second) {
+    this.first = first;
+    this.second = second;
+  };
+  ($traceurRuntime.createClass)(SwitchClause, {}, {});
+  var SwitchState = function SwitchState(id, expression, clauses) {
+    $traceurRuntime.superCall(this, $SwitchState.prototype, "constructor", [id]);
+    this.expression = expression;
+    this.clauses = clauses;
+  };
+  var $SwitchState = SwitchState;
+  ($traceurRuntime.createClass)(SwitchState, {
+    replaceState: function(oldState, newState) {
+      var clauses = this.clauses.map((function(clause) {
+        return new SwitchClause(clause.first, State.replaceStateId(clause.second, oldState, newState));
+      }));
+      return new $SwitchState(State.replaceStateId(this.id, oldState, newState), this.expression, clauses);
+    },
+    transform: function(enclosingFinally, machineEndState, reporter) {
+      var clauses = [];
+      for (var i = 0; i < this.clauses.length; i++) {
+        var clause = this.clauses[i];
+        if (clause.first == null) {
+          clauses.push(new DefaultClause(null, State.generateJump(enclosingFinally, clause.second)));
+        } else {
+          clauses.push(new CaseClause(null, clause.first, State.generateJump(enclosingFinally, clause.second)));
+        }
+      }
+      return createStatementList(new SwitchStatement(null, this.expression, clauses), createBreakStatement());
+    }
+  }, {}, State);
+  return {
+    get SwitchClause() {
+      return SwitchClause;
+    },
+    get SwitchState() {
+      return SwitchState;
+    }
+  };
+});
+System.register("traceur@0.0.32/src/codegeneration/generator/CPSTransformer", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/generator/CPSTransformer";
+  var $__221 = Object.freeze(Object.defineProperties(["$ctx.pushTry(\n            ", ",\n            ", ");"], {raw: {value: Object.freeze(["$ctx.pushTry(\n            ", ",\n            ", ");"])}})),
+      $__222 = Object.freeze(Object.defineProperties(["$ctx.popTry();"], {raw: {value: Object.freeze(["$ctx.popTry();"])}})),
+      $__223 = Object.freeze(Object.defineProperties(["\n              $ctx.popTry();\n              ", " = $ctx.storedException;"], {raw: {value: Object.freeze(["\n              $ctx.popTry();\n              ", " = $ctx.storedException;"])}})),
+      $__224 = Object.freeze(Object.defineProperties(["$ctx.popTry();"], {raw: {value: Object.freeze(["$ctx.popTry();"])}})),
+      $__225 = Object.freeze(Object.defineProperties(["function($ctx) {\n      while (true) ", "\n    }"], {raw: {value: Object.freeze(["function($ctx) {\n      while (true) ", "\n    }"])}})),
+      $__226 = Object.freeze(Object.defineProperties(["var $arguments = arguments;"], {raw: {value: Object.freeze(["var $arguments = arguments;"])}})),
+      $__227 = Object.freeze(Object.defineProperties(["return ", "(\n            ", ",\n            this);"], {raw: {value: Object.freeze(["return ", "(\n            ", ",\n            this);"])}})),
+      $__228 = Object.freeze(Object.defineProperties(["return $ctx.end()"], {raw: {value: Object.freeze(["return $ctx.end()"])}})),
+      $__229 = Object.freeze(Object.defineProperties(["\n                  $ctx.state = $ctx.finallyFallThrough;\n                  $ctx.finallyFallThrough = ", ";\n                  break;"], {raw: {value: Object.freeze(["\n                  $ctx.state = $ctx.finallyFallThrough;\n                  $ctx.finallyFallThrough = ", ";\n                  break;"])}})),
+      $__230 = Object.freeze(Object.defineProperties(["\n                      $ctx.state = $ctx.finallyFallThrough;\n                      break;"], {raw: {value: Object.freeze(["\n                      $ctx.state = $ctx.finallyFallThrough;\n                      break;"])}}));
+  var AlphaRenamer = System.get("traceur@0.0.32/src/codegeneration/AlphaRenamer").AlphaRenamer;
+  var BreakContinueTransformer = System.get("traceur@0.0.32/src/codegeneration/generator/BreakContinueTransformer").BreakContinueTransformer;
+  var $__233 = System.get("traceur@0.0.32/src/syntax/trees/ParseTreeType"),
+      BLOCK = $__233.BLOCK,
+      BREAK_STATEMENT = $__233.BREAK_STATEMENT,
+      CASE_CLAUSE = $__233.CASE_CLAUSE,
+      CONDITIONAL_EXPRESSION = $__233.CONDITIONAL_EXPRESSION,
+      CONTINUE_STATEMENT = $__233.CONTINUE_STATEMENT,
+      EXPRESSION_STATEMENT = $__233.EXPRESSION_STATEMENT,
+      PAREN_EXPRESSION = $__233.PAREN_EXPRESSION,
+      STATE_MACHINE = $__233.STATE_MACHINE;
+  var $__233 = System.get("traceur@0.0.32/src/syntax/trees/ParseTrees"),
+      AnonBlock = $__233.AnonBlock,
+      Block = $__233.Block,
+      CaseClause = $__233.CaseClause,
+      IfStatement = $__233.IfStatement,
+      SwitchStatement = $__233.SwitchStatement;
+  var CatchState = System.get("traceur@0.0.32/src/codegeneration/generator/CatchState").CatchState;
+  var ConditionalState = System.get("traceur@0.0.32/src/codegeneration/generator/ConditionalState").ConditionalState;
+  var ExplodeExpressionTransformer = System.get("traceur@0.0.32/src/codegeneration/ExplodeExpressionTransformer").ExplodeExpressionTransformer;
+  var FallThroughState = System.get("traceur@0.0.32/src/codegeneration/generator/FallThroughState").FallThroughState;
+  var FinallyFallThroughState = System.get("traceur@0.0.32/src/codegeneration/generator/FinallyFallThroughState").FinallyFallThroughState;
+  var FinallyState = System.get("traceur@0.0.32/src/codegeneration/generator/FinallyState").FinallyState;
+  var FindInFunctionScope = System.get("traceur@0.0.32/src/codegeneration/FindInFunctionScope").FindInFunctionScope;
+  var ParseTreeTransformer = System.get("traceur@0.0.32/src/codegeneration/ParseTreeTransformer").ParseTreeTransformer;
+  var TempVarTransformer = System.get("traceur@0.0.32/src/codegeneration/TempVarTransformer").TempVarTransformer;
+  var assert = System.get("traceur@0.0.32/src/util/assert").assert;
+  var $__233 = System.get("traceur@0.0.32/src/codegeneration/PlaceholderParser"),
+      parseExpression = $__233.parseExpression,
+      parseStatement = $__233.parseStatement,
+      parseStatements = $__233.parseStatements;
+  var State = System.get("traceur@0.0.32/src/codegeneration/generator/State").State;
+  var StateAllocator = System.get("traceur@0.0.32/src/codegeneration/generator/StateAllocator").StateAllocator;
+  var StateMachine = System.get("traceur@0.0.32/src/syntax/trees/StateMachine").StateMachine;
+  var $__233 = System.get("traceur@0.0.32/src/codegeneration/generator/SwitchState"),
+      SwitchClause = $__233.SwitchClause,
+      SwitchState = $__233.SwitchState;
+  var TryState = System.get("traceur@0.0.32/src/codegeneration/generator/TryState").TryState;
+  var $__233 = System.get("traceur@0.0.32/src/codegeneration/ParseTreeFactory"),
+      createAssignStateStatement = $__233.createAssignStateStatement,
+      createBreakStatement = $__233.createBreakStatement,
+      createCaseClause = $__233.createCaseClause,
+      createDefaultClause = $__233.createDefaultClause,
+      createExpressionStatement = $__233.createExpressionStatement,
+      createFunctionBody = $__233.createFunctionBody,
+      id = $__233.createIdentifierExpression,
+      createMemberExpression = $__233.createMemberExpression,
+      createNumberLiteral = $__233.createNumberLiteral,
+      createStatementList = $__233.createStatementList,
+      createSwitchStatement = $__233.createSwitchStatement;
+  var HoistVariablesTransformer = System.get("traceur@0.0.32/src/codegeneration/HoistVariablesTransformer").default;
+  var LabelState = function LabelState(name, continueState, fallThroughState) {
+    this.name = name;
+    this.continueState = continueState;
+    this.fallThroughState = fallThroughState;
+  };
+  ($traceurRuntime.createClass)(LabelState, {}, {});
+  var NeedsStateMachine = function NeedsStateMachine() {
+    $traceurRuntime.defaultSuperCall(this, $NeedsStateMachine.prototype, arguments);
+  };
+  var $NeedsStateMachine = NeedsStateMachine;
+  ($traceurRuntime.createClass)(NeedsStateMachine, {
+    visitBreakStatement: function(tree) {
+      this.found = true;
+    },
+    visitContinueStatement: function(tree) {
+      this.found = true;
+    },
+    visitStateMachine: function(tree) {
+      this.found = true;
+    },
+    visitYieldExpression: function(tee) {
+      this.found = true;
+    }
+  }, {}, FindInFunctionScope);
+  function needsStateMachine(tree) {
+    var visitor = new NeedsStateMachine(tree);
+    return visitor.found;
+  }
+  var HoistVariables = function HoistVariables() {
+    $traceurRuntime.defaultSuperCall(this, $HoistVariables.prototype, arguments);
+  };
+  var $HoistVariables = HoistVariables;
+  ($traceurRuntime.createClass)(HoistVariables, {prependVariables: function(statements) {
+      return statements;
+    }}, {}, HoistVariablesTransformer);
+  var CPSTransformer = function CPSTransformer(identifierGenerator, reporter) {
+    $traceurRuntime.superCall(this, $CPSTransformer.prototype, "constructor", [identifierGenerator]);
+    this.reporter = reporter;
+    this.stateAllocator_ = new StateAllocator();
+    this.labelSet_ = Object.create(null);
+    this.currentLabel_ = null;
+    this.hoistVariablesTransformer_ = new HoistVariables();
+  };
+  var $CPSTransformer = CPSTransformer;
+  ($traceurRuntime.createClass)(CPSTransformer, {
+    expressionNeedsStateMachine: function(tree) {
+      return false;
+    },
+    allocateState: function() {
+      return this.stateAllocator_.allocateState();
+    },
+    transformBlock: function(tree) {
+      var labels = this.getLabels_();
+      var label = this.clearCurrentLabel_();
+      var transformedTree = $traceurRuntime.superCall(this, $CPSTransformer.prototype, "transformBlock", [tree]);
+      var machine = this.transformStatementList_(transformedTree.statements);
+      if (machine === null)
+        return transformedTree;
+      if (label) {
+        var states = [];
+        for (var i = 0; i < machine.states.length; i++) {
+          var state = machine.states[i];
+          states.push(state.transformBreakOrContinue(labels));
+        }
+        machine = new StateMachine(machine.startState, machine.fallThroughState, states, machine.exceptionBlocks);
+      }
+      return machine;
+    },
+    transformFunctionBody: function(tree) {
+      this.pushTempVarState();
+      var oldLabels = this.clearLabels_();
+      var transformedTree = $traceurRuntime.superCall(this, $CPSTransformer.prototype, "transformFunctionBody", [tree]);
+      var machine = this.transformStatementList_(transformedTree.statements);
+      this.restoreLabels_(oldLabels);
+      this.popTempVarState();
+      return machine == null ? transformedTree : machine;
+    },
+    transformStatementList_: function(trees) {
+      var groups = [];
+      var newMachine;
+      for (var i = 0; i < trees.length; i++) {
+        if (trees[i].type === STATE_MACHINE) {
+          groups.push(trees[i]);
+        } else if (needsStateMachine(trees[i])) {
+          newMachine = this.ensureTransformed_(trees[i]);
+          groups.push(newMachine);
+        } else {
+          var last = groups[groups.length - 1];
+          if (!(last instanceof Array))
+            groups.push(last = []);
+          last.push(trees[i]);
+        }
+      }
+      if (groups.length === 1 && groups[0] instanceof Array)
+        return null;
+      var machine = null;
+      for (var i = 0; i < groups.length; i++) {
+        if (groups[i] instanceof Array) {
+          newMachine = this.statementsToStateMachine_(groups[i]);
+        } else {
+          newMachine = groups[i];
+        }
+        if (i === 0)
+          machine = newMachine;
+        else
+          machine = machine.append(newMachine);
+      }
+      return machine;
+    },
+    needsStateMachine_: function(statements) {
+      if (statements instanceof Array) {
+        for (var i = 0; i < statements.length; i++) {
+          if (needsStateMachine(statements[i]))
+            return true;
+        }
+        return false;
+      }
+      assert(statements instanceof SwitchStatement);
+      return needsStateMachine(statements);
+    },
+    transformCaseClause: function(tree) {
+      var result = $traceurRuntime.superCall(this, $CPSTransformer.prototype, "transformCaseClause", [tree]);
+      var machine = this.transformStatementList_(result.statements);
+      return machine == null ? result : new CaseClause(null, result.expression, createStatementList(machine));
+    },
+    transformDoWhileStatement: function(tree) {
+      var $__235;
+      var $__233,
+          $__234;
+      var labels = this.getLabels_();
+      var label = this.clearCurrentLabel_();
+      var machine,
+          condition,
+          body;
+      if (this.expressionNeedsStateMachine(tree.condition)) {
+        (($__233 = this.expressionToStateMachine(tree.condition), machine = $__233.machine, condition = $__233.expression, $__233));
+        body = this.transformAny(tree.body);
+      } else {
+        var result = $traceurRuntime.superCall(this, $CPSTransformer.prototype, "transformDoWhileStatement", [tree]);
+        (($__234 = result, condition = $__234.condition, body = $__234.body, $__234));
+        if (body.type != STATE_MACHINE)
+          return result;
+      }
+      var loopBodyMachine = this.ensureTransformed_(body);
+      var startState = loopBodyMachine.startState;
+      var conditionState = loopBodyMachine.fallThroughState;
+      var fallThroughState = this.allocateState();
+      var states = [];
+      this.addLoopBodyStates_(loopBodyMachine, conditionState, fallThroughState, labels, states);
+      if (machine) {
+        machine = machine.replaceStartState(conditionState);
+        conditionState = machine.fallThroughState;
+        ($__235 = states).push.apply($__235, $traceurRuntime.toObject(machine.states));
+      }
+      states.push(new ConditionalState(conditionState, startState, fallThroughState, condition));
+      var machine = new StateMachine(startState, fallThroughState, states, loopBodyMachine.exceptionBlocks);
+      if (label)
+        machine = machine.replaceStateId(conditionState, label.continueState);
+      return machine;
+    },
+    addLoopBodyStates_: function(loopBodyMachine, continueState, breakState, labels, states) {
+      for (var i = 0; i < loopBodyMachine.states.length; i++) {
+        var state = loopBodyMachine.states[i];
+        states.push(state.transformBreakOrContinue(labels, breakState, continueState));
+      }
+    },
+    transformForStatement: function(tree) {
+      var $__235;
+      var labels = this.getLabels_();
+      var label = this.clearCurrentLabel_();
+      var tmp;
+      var initialiser = null,
+          initialiserMachine;
+      if (tree.initialiser) {
+        if (this.expressionNeedsStateMachine(tree.initialiser)) {
+          tmp = this.expressionToStateMachine(tree.initialiser);
+          initialiser = tmp.expression;
+          initialiserMachine = tmp.machine;
+        } else {
+          initialiser = this.transformAny(tree.initialiser);
+        }
+      }
+      var condition = null,
+          conditionMachine;
+      if (tree.condition) {
+        if (this.expressionNeedsStateMachine(tree.condition)) {
+          tmp = this.expressionToStateMachine(tree.condition);
+          condition = tmp.expression;
+          conditionMachine = tmp.machine;
+        } else {
+          condition = this.transformAny(tree.condition);
+        }
+      }
+      var increment = null,
+          incrementMachine;
+      if (tree.increment) {
+        if (this.expressionNeedsStateMachine(tree.increment)) {
+          tmp = this.expressionToStateMachine(tree.increment);
+          increment = tmp.expression;
+          incrementMachine = tmp.machine;
+        } else {
+          increment = this.transformAny(tree.increment);
+        }
+      }
+      var body = this.transformAny(tree.body);
+      if (initialiser === tree.initialiser && condition === tree.condition && increment === tree.increment && body === tree.body) {
+        return tree;
+      }
+      if (!initialiserMachine && !conditionMachine && !incrementMachine && body.type !== STATE_MACHINE) {
+        return new ForStatement(tree.location, initialiser, condition, increment, body);
+      }
+      var loopBodyMachine = this.ensureTransformed_(body);
+      var bodyFallThroughId = loopBodyMachine.fallThroughState;
+      var fallThroughId = this.allocateState();
+      var startId;
+      var initialiserStartId = initialiser ? this.allocateState() : State.INVALID_STATE;
+      var conditionStartId = increment ? this.allocateState() : bodyFallThroughId;
+      var loopStartId = loopBodyMachine.startState;
+      var incrementStartId = bodyFallThroughId;
+      var states = [];
+      if (initialiser) {
+        startId = initialiserStartId;
+        var initialiserFallThroughId;
+        if (condition)
+          initialiserFallThroughId = conditionStartId;
+        else
+          initialiserFallThroughId = loopStartId;
+        var tmpId = initialiserStartId;
+        if (initialiserMachine) {
+          initialiserMachine = initialiserMachine.replaceStartState(initialiserStartId);
+          tmpId = initialiserMachine.fallThroughState;
+          ($__235 = states).push.apply($__235, $traceurRuntime.toObject(initialiserMachine.states));
+        }
+        states.push(new FallThroughState(tmpId, initialiserFallThroughId, createStatementList(createExpressionStatement(initialiser))));
+      }
+      if (condition) {
+        if (!initialiser)
+          startId = conditionStartId;
+        var tmpId = conditionStartId;
+        if (conditionMachine) {
+          conditionMachine = conditionMachine.replaceStartState(conditionStartId);
+          tmpId = conditionMachine.fallThroughState;
+          ($__235 = states).push.apply($__235, $traceurRuntime.toObject(conditionMachine.states));
+        }
+        states.push(new ConditionalState(tmpId, loopStartId, fallThroughId, condition));
+      }
+      if (increment) {
+        var incrementFallThroughId;
+        if (condition)
+          incrementFallThroughId = conditionStartId;
+        else
+          incrementFallThroughId = loopStartId;
+        var tmpId = incrementStartId;
+        if (incrementMachine) {
+          incrementMachine = incrementMachine.replaceStartState(incrementStartId);
+          tmpId = incrementMachine.fallThroughState;
+          ($__235 = states).push.apply($__235, $traceurRuntime.toObject(incrementMachine.states));
+        }
+        states.push(new FallThroughState(tmpId, incrementFallThroughId, createStatementList(createExpressionStatement(increment))));
+      }
+      if (!initialiser && !condition)
+        startId = loopStartId;
+      var continueId;
+      if (increment)
+        continueId = incrementStartId;
+      else if (condition)
+        continueId = conditionStartId;
+      else
+        continueId = loopStartId;
+      if (!increment && !condition) {
+        loopBodyMachine = loopBodyMachine.replaceFallThroughState(loopBodyMachine.startState);
+      }
+      this.addLoopBodyStates_(loopBodyMachine, continueId, fallThroughId, labels, states);
+      var machine = new StateMachine(startId, fallThroughId, states, loopBodyMachine.exceptionBlocks);
+      if (label)
+        machine = machine.replaceStateId(continueId, label.continueState);
+      return machine;
+    },
+    transformForInStatement: function(tree) {
+      return tree;
+    },
+    transformForOfStatement: function(tree) {
+      throw new Error('for of statements should be transformed before this pass');
+    },
+    transformIfStatement: function(tree) {
+      var $__235;
+      var $__233,
+          $__234;
+      var machine,
+          condition,
+          ifClause,
+          elseClause;
+      if (this.expressionNeedsStateMachine(tree.condition)) {
+        (($__233 = this.expressionToStateMachine(tree.condition), machine = $__233.machine, condition = $__233.expression, $__233));
+        ifClause = this.transformAny(tree.ifClause);
+        elseClause = this.transformAny(tree.elseClause);
+      } else {
+        var result = $traceurRuntime.superCall(this, $CPSTransformer.prototype, "transformIfStatement", [tree]);
+        (($__234 = result, condition = $__234.condition, ifClause = $__234.ifClause, elseClause = $__234.elseClause, $__234));
+        if (ifClause.type !== STATE_MACHINE && (elseClause === null || elseClause.type !== STATE_MACHINE)) {
+          return result;
+        }
+      }
+      ifClause = this.ensureTransformed_(ifClause);
+      elseClause = this.ensureTransformed_(elseClause);
+      var startState = this.allocateState();
+      var fallThroughState = ifClause.fallThroughState;
+      var ifState = ifClause.startState;
+      var elseState = elseClause == null ? fallThroughState : elseClause.startState;
+      var states = [];
+      var exceptionBlocks = [];
+      states.push(new ConditionalState(startState, ifState, elseState, condition));
+      ($__235 = states).push.apply($__235, $traceurRuntime.toObject(ifClause.states));
+      ($__235 = exceptionBlocks).push.apply($__235, $traceurRuntime.toObject(ifClause.exceptionBlocks));
+      if (elseClause != null) {
+        this.replaceAndAddStates_(elseClause.states, elseClause.fallThroughState, fallThroughState, states);
+        ($__235 = exceptionBlocks).push.apply($__235, $traceurRuntime.toObject(State.replaceAllStates(elseClause.exceptionBlocks, elseClause.fallThroughState, fallThroughState)));
+      }
+      var ifMachine = new StateMachine(startState, fallThroughState, states, exceptionBlocks);
+      if (machine)
+        ifMachine = machine.append(ifMachine);
+      return ifMachine;
+    },
+    removeEmptyStates: function(oldStates) {
+      var emptyStates = [],
+          newStates = [];
+      for (var i = 0; i < oldStates.length; i++) {
+        if (oldStates[i] instanceof FallThroughState && oldStates[i].statements.length === 0) {
+          emptyStates.push(oldStates[i]);
+        } else {
+          newStates.push(oldStates[i]);
+        }
+      }
+      for (i = 0; i < newStates.length; i++) {
+        newStates[i] = emptyStates.reduce((function(state, $__233) {
+          var id = $__233.id,
+              fallThroughState = $__233.fallThroughState;
+          return state.replaceState(id, fallThroughState);
+        }), newStates[i]);
+      }
+      return newStates;
+    },
+    replaceAndAddStates_: function(oldStates, oldState, newState, newStates) {
+      for (var i = 0; i < oldStates.length; i++) {
+        newStates.push(oldStates[i].replaceState(oldState, newState));
+      }
+    },
+    transformLabelledStatement: function(tree) {
+      var startState = this.allocateState();
+      var continueState = this.allocateState();
+      var fallThroughState = this.allocateState();
+      var label = new LabelState(tree.name.value, continueState, fallThroughState);
+      var oldLabels = this.addLabel_(label);
+      this.currentLabel_ = label;
+      var result = this.transformAny(tree.statement);
+      if (result === tree.statement) {
+        result = tree;
+      } else if (result.type === STATE_MACHINE) {
+        result = result.replaceStartState(startState);
+        result = result.replaceFallThroughState(fallThroughState);
+      }
+      this.restoreLabels_(oldLabels);
+      return result;
+    },
+    getLabels_: function() {
+      return this.labelSet_;
+    },
+    restoreLabels_: function(oldLabels) {
+      this.labelSet_ = oldLabels;
+    },
+    addLabel_: function(label) {
+      var oldLabels = this.labelSet_;
+      var labelSet = Object.create(null);
+      for (var k in this.labelSet_) {
+        labelSet[k] = this.labelSet_[k];
+      }
+      labelSet[label.name] = label;
+      this.labelSet_ = labelSet;
+      return oldLabels;
+    },
+    clearLabels_: function() {
+      var result = this.labelSet_;
+      this.labelSet_ = Object.create(null);
+      return result;
+    },
+    clearCurrentLabel_: function() {
+      var result = this.currentLabel_;
+      this.currentLabel_ = null;
+      return result;
+    },
+    transformSwitchStatement: function(tree) {
+      var $__233,
+          $__234;
+      var labels = this.getLabels_();
+      var expression,
+          machine,
+          caseClauses;
+      if (this.expressionNeedsStateMachine(tree.expression)) {
+        (($__233 = this.expressionToStateMachine(tree.expression), expression = $__233.expression, machine = $__233.machine, $__233));
+        caseClauses = this.transformList(tree.caseClauses);
+      } else {
+        var result = $traceurRuntime.superCall(this, $CPSTransformer.prototype, "transformSwitchStatement", [tree]);
+        if (!needsStateMachine(result))
+          return result;
+        (($__234 = result, expression = $__234.expression, caseClauses = $__234.caseClauses, $__234));
+      }
+      var startState = this.allocateState();
+      var fallThroughState = this.allocateState();
+      var nextState = fallThroughState;
+      var states = [];
+      var clauses = [];
+      var tryStates = [];
+      var hasDefault = false;
+      for (var index = caseClauses.length - 1; index >= 0; index--) {
+        var clause = caseClauses[index];
+        if (clause.type == CASE_CLAUSE) {
+          var caseClause = clause;
+          nextState = this.addSwitchClauseStates_(nextState, fallThroughState, labels, caseClause.statements, states, tryStates);
+          clauses.push(new SwitchClause(caseClause.expression, nextState));
+        } else {
+          hasDefault = true;
+          var defaultClause = clause;
+          nextState = this.addSwitchClauseStates_(nextState, fallThroughState, labels, defaultClause.statements, states, tryStates);
+          clauses.push(new SwitchClause(null, nextState));
+        }
+      }
+      if (!hasDefault) {
+        clauses.push(new SwitchClause(null, fallThroughState));
+      }
+      states.push(new SwitchState(startState, expression, clauses.reverse()));
+      var switchMachine = new StateMachine(startState, fallThroughState, states.reverse(), tryStates);
+      if (machine)
+        switchMachine = machine.append(switchMachine);
+      return switchMachine;
+    },
+    addSwitchClauseStates_: function(nextState, fallThroughState, labels, statements, states, tryStates) {
+      var $__235;
+      var machine = this.ensureTransformedList_(statements);
+      for (var i = 0; i < machine.states.length; i++) {
+        var state = machine.states[i];
+        var transformedState = state.transformBreak(labels, fallThroughState);
+        states.push(transformedState.replaceState(machine.fallThroughState, nextState));
+      }
+      ($__235 = tryStates).push.apply($__235, $traceurRuntime.toObject(machine.exceptionBlocks));
+      return machine.startState;
+    },
+    transformTryStatement: function(tree) {
+      var result = $traceurRuntime.superCall(this, $CPSTransformer.prototype, "transformTryStatement", [tree]);
+      var $__233 = result,
+          body = $__233.body,
+          catchBlock = $__233.catchBlock,
+          finallyBlock = $__233.finallyBlock;
+      if (body.type != STATE_MACHINE && (catchBlock == null || catchBlock.catchBody.type != STATE_MACHINE) && (finallyBlock == null || finallyBlock.block.type != STATE_MACHINE)) {
+        return result;
+      }
+      var outerCatchState = this.allocateState();
+      var outerFinallyState = this.allocateState();
+      var pushTryState = this.statementToStateMachine_(parseStatement($__221, (catchBlock && outerCatchState), (finallyBlock && outerFinallyState)));
+      var tryMachine = this.ensureTransformed_(body);
+      tryMachine = pushTryState.append(tryMachine);
+      if (catchBlock !== null) {
+        var popTry = this.statementToStateMachine_(parseStatement($__222));
+        tryMachine = tryMachine.append(popTry);
+        var exceptionName = catchBlock.binding.identifierToken.value;
+        var catchMachine = this.ensureTransformed_(catchBlock.catchBody);
+        var catchStart = this.allocateState();
+        this.addMachineVariable(exceptionName);
+        var states = $traceurRuntime.spread(tryMachine.states, [new FallThroughState(catchStart, catchMachine.startState, parseStatements($__223, id(exceptionName)))]);
+        this.replaceAndAddStates_(catchMachine.states, catchMachine.fallThroughState, tryMachine.fallThroughState, states);
+        tryMachine = new StateMachine(tryMachine.startState, tryMachine.fallThroughState, states, [new CatchState(exceptionName, catchStart, tryMachine.fallThroughState, tryMachine.getAllStateIDs(), tryMachine.exceptionBlocks)]);
+        tryMachine = tryMachine.replaceStateId(catchStart, outerCatchState);
+      }
+      if (finallyBlock != null) {
+        var finallyMachine = this.ensureTransformed_(finallyBlock.block);
+        var popTry = this.statementToStateMachine_(parseStatement($__224));
+        finallyMachine = popTry.append(finallyMachine);
+        var states = $traceurRuntime.spread(tryMachine.states, finallyMachine.states, [new FinallyFallThroughState(finallyMachine.fallThroughState)]);
+        tryMachine = new StateMachine(tryMachine.startState, tryMachine.fallThroughState, states, [new FinallyState(finallyMachine.startState, finallyMachine.fallThroughState, tryMachine.getAllStateIDs(), tryMachine.exceptionBlocks)]);
+        tryMachine = tryMachine.replaceStateId(finallyMachine.startState, outerFinallyState);
+      }
+      return tryMachine;
+    },
+    transformWhileStatement: function(tree) {
+      var $__235;
+      var $__233,
+          $__234;
+      var labels = this.getLabels_();
+      var label = this.clearCurrentLabel_();
+      var condition,
+          machine,
+          body;
+      if (this.expressionNeedsStateMachine(tree.condition)) {
+        (($__233 = this.expressionToStateMachine(tree.condition), machine = $__233.machine, condition = $__233.expression, $__233));
+        body = this.transformAny(tree.body);
+      } else {
+        var result = $traceurRuntime.superCall(this, $CPSTransformer.prototype, "transformWhileStatement", [tree]);
+        (($__234 = result, condition = $__234.condition, body = $__234.body, $__234));
+        if (body.type !== STATE_MACHINE)
+          return result;
+      }
+      var loopBodyMachine = this.ensureTransformed_(body);
+      var startState = loopBodyMachine.fallThroughState;
+      var fallThroughState = this.allocateState();
+      var states = [];
+      var conditionStart = startState;
+      if (machine) {
+        machine = machine.replaceStartState(startState);
+        conditionStart = machine.fallThroughState;
+        ($__235 = states).push.apply($__235, $traceurRuntime.toObject(machine.states));
+      }
+      states.push(new ConditionalState(conditionStart, loopBodyMachine.startState, fallThroughState, condition));
+      this.addLoopBodyStates_(loopBodyMachine, startState, fallThroughState, labels, states);
+      var machine = new StateMachine(startState, fallThroughState, states, loopBodyMachine.exceptionBlocks);
+      if (label)
+        machine = machine.replaceStateId(startState, label.continueState);
+      return machine;
+    },
+    transformWithStatement: function(tree) {
+      var result = $traceurRuntime.superCall(this, $CPSTransformer.prototype, "transformWithStatement", [tree]);
+      if (result.body.type != STATE_MACHINE) {
+        return result;
+      }
+      throw new Error('Unreachable - with statement not allowed in strict mode/harmony');
+    },
+    generateMachineInnerFunction: function(machine) {
+      var enclosingFinallyState = machine.getEnclosingFinallyMap();
+      var SwitchStatement = createSwitchStatement(createMemberExpression('$ctx', 'state'), this.transformMachineStates(machine, State.END_STATE, State.RETHROW_STATE, enclosingFinallyState));
+      return parseExpression($__225, SwitchStatement);
+    },
+    addTempVar: function() {
+      var name = this.getTempIdentifier();
+      this.addMachineVariable(name);
+      return name;
+    },
+    addMachineVariable: function(name) {
+      this.hoistVariablesTransformer_.addVariable(name);
+    },
+    transformCpsFunctionBody: function(tree, runtimeMethod) {
+      var alphaRenamedTree = AlphaRenamer.rename(tree, 'arguments', '$arguments');
+      var hasArguments = alphaRenamedTree !== tree;
+      var hoistedTree = this.hoistVariablesTransformer_.transformAny(alphaRenamedTree);
+      var maybeMachine = this.transformAny(hoistedTree);
+      if (this.reporter.hadError())
+        return tree;
+      var machine;
+      if (maybeMachine.type !== STATE_MACHINE) {
+        machine = this.statementsToStateMachine_(maybeMachine.statements);
+      } else {
+        machine = new StateMachine(maybeMachine.startState, maybeMachine.fallThroughState, this.removeEmptyStates(maybeMachine.states), maybeMachine.exceptionBlocks);
+      }
+      machine = machine.replaceFallThroughState(State.END_STATE).replaceStartState(State.START_STATE);
+      var statements = [];
+      if (this.hoistVariablesTransformer_.hasVariables())
+        statements.push(this.hoistVariablesTransformer_.getVariableStatement());
+      if (hasArguments)
+        statements.push(parseStatement($__226));
+      statements.push(parseStatement($__227, runtimeMethod, this.generateMachineInnerFunction(machine)));
+      return createFunctionBody(statements);
+    },
+    transformFunctionDeclaration: function(tree) {
+      return tree;
+    },
+    transformFunctionExpression: function(tree) {
+      return tree;
+    },
+    transformGetAccessor: function(tree) {
+      return tree;
+    },
+    transformSetAccessor: function(tree) {
+      return tree;
+    },
+    transformStateMachine: function(tree) {
+      return tree;
+    },
+    statementToStateMachine_: function(statement) {
+      var statements;
+      if (statement.type === BLOCK)
+        statements = statement.statements;
+      else
+        statements = [statement];
+      return this.statementsToStateMachine_(statements);
+    },
+    statementsToStateMachine_: function(statements) {
+      var startState = this.allocateState();
+      var fallThroughState = this.allocateState();
+      return this.stateToStateMachine_(new FallThroughState(startState, fallThroughState, statements), fallThroughState);
+    },
+    stateToStateMachine_: function(newState, fallThroughState) {
+      return new StateMachine(newState.id, fallThroughState, [newState], []);
+    },
+    transformMachineStates: function(machine, machineEndState, rethrowState, enclosingFinallyState) {
+      var cases = [];
+      for (var i = 0; i < machine.states.length; i++) {
+        var state = machine.states[i];
+        var stateCase = state.transformMachineState(enclosingFinallyState[state.id], machineEndState, this.reporter);
+        if (stateCase != null) {
+          cases.push(stateCase);
+        }
+      }
+      this.addFinallyFallThroughDispatches(null, machine.exceptionBlocks, cases);
+      cases.push(createDefaultClause(parseStatements($__228)));
+      return cases;
+    },
+    addFinallyFallThroughDispatches: function(enclosingFinallyState, tryStates, cases) {
+      for (var i = 0; i < tryStates.length; i++) {
+        var tryState = tryStates[i];
+        if (tryState.kind == TryState.Kind.FINALLY) {
+          var finallyState = tryState;
+          if (enclosingFinallyState != null) {
+            var caseClauses = [];
+            var index = 0;
+            for (var j = 0; j < enclosingFinallyState.tryStates.length; j++) {
+              var destination = enclosingFinallyState.tryStates[j];
+              index++;
+              var statements;
+              if (index < enclosingFinallyState.tryStates.length) {
+                statements = createStatementList();
+              } else {
+                statements = parseStatements($__229, State.INVALID_STATE);
+              }
+              caseClauses.push(createCaseClause(createNumberLiteral(destination), statements));
+            }
+            caseClauses.push(createDefaultClause(createStatementList(createAssignStateStatement(enclosingFinallyState.finallyState), createBreakStatement())));
+            cases.push(createCaseClause(createNumberLiteral(finallyState.fallThroughState), createStatementList(createSwitchStatement(createMemberExpression('$ctx', 'finallyFallThrough'), caseClauses), createBreakStatement())));
+          } else {
+            cases.push(createCaseClause(createNumberLiteral(finallyState.fallThroughState), parseStatements($__230)));
+          }
+          this.addFinallyFallThroughDispatches(finallyState, finallyState.nestedTrys, cases);
+        } else {
+          this.addFinallyFallThroughDispatches(enclosingFinallyState, tryState.nestedTrys, cases);
+        }
+      }
+    },
+    transformVariableDeclarationList: function(tree) {
+      this.reporter.reportError(tree.location && tree.location.start, 'Traceur: const/let declarations in a block containing a yield are ' + 'not yet implemented');
+      return tree;
+    },
+    maybeTransformStatement_: function(maybeTransformedStatement) {
+      var breakContinueTransformed = new BreakContinueTransformer(this.stateAllocator_).transformAny(maybeTransformedStatement);
+      if (breakContinueTransformed != maybeTransformedStatement) {
+        breakContinueTransformed = this.transformAny(breakContinueTransformed);
+      }
+      return breakContinueTransformed;
+    },
+    ensureTransformed_: function(statement) {
+      if (statement == null) {
+        return null;
+      }
+      var maybeTransformed = this.maybeTransformStatement_(statement);
+      return maybeTransformed.type == STATE_MACHINE ? maybeTransformed : this.statementToStateMachine_(maybeTransformed);
+    },
+    ensureTransformedList_: function(statements) {
+      var maybeTransformedStatements = [];
+      var foundMachine = false;
+      for (var i = 0; i < statements.length; i++) {
+        var statement = statements[i];
+        var maybeTransformedStatement = this.maybeTransformStatement_(statement);
+        maybeTransformedStatements.push(maybeTransformedStatement);
+        if (maybeTransformedStatement.type == STATE_MACHINE) {
+          foundMachine = true;
+        }
+      }
+      if (!foundMachine) {
+        return this.statementsToStateMachine_(statements);
+      }
+      return this.transformStatementList_(maybeTransformedStatements);
+    },
+    expressionToStateMachine: function(tree) {
+      var commaExpression = new ExplodeExpressionTransformer(this).transformAny(tree);
+      var statements = new NormalizeCommaExpressionToStatementTransformer().transformAny(commaExpression).statements;
+      var lastStatement = statements.pop();
+      assert(lastStatement.type === EXPRESSION_STATEMENT);
+      var expression = lastStatement.expression;
+      statements = $traceurRuntime.superCall(this, $CPSTransformer.prototype, "transformList", [statements]);
+      var machine = this.transformStatementList_(statements);
+      return {
+        expression: expression,
+        machine: machine
+      };
+    }
+  }, {}, TempVarTransformer);
+  var NormalizeCommaExpressionToStatementTransformer = function NormalizeCommaExpressionToStatementTransformer() {
+    $traceurRuntime.defaultSuperCall(this, $NormalizeCommaExpressionToStatementTransformer.prototype, arguments);
+  };
+  var $NormalizeCommaExpressionToStatementTransformer = NormalizeCommaExpressionToStatementTransformer;
+  ($traceurRuntime.createClass)(NormalizeCommaExpressionToStatementTransformer, {
+    transformCommaExpression: function(tree) {
+      var $__231 = this;
+      var statements = tree.expressions.map((function(expr) {
+        if (expr.type === CONDITIONAL_EXPRESSION)
+          return $__231.transformAny(expr);
+        return createExpressionStatement(expr);
+      }));
+      return new AnonBlock(tree.location, statements);
+    },
+    transformConditionalExpression: function(tree) {
+      var ifBlock = this.transformAny(tree.left);
+      var elseBlock = this.transformAny(tree.right);
+      return new IfStatement(tree.location, tree.condition, anonBlockToBlock(ifBlock), anonBlockToBlock(elseBlock));
+    }
+  }, {}, ParseTreeTransformer);
+  function anonBlockToBlock(tree) {
+    if (tree.type === PAREN_EXPRESSION)
+      return anonBlockToBlock(tree.expression);
+    return new Block(tree.location, tree.statements);
+  }
+  return {get CPSTransformer() {
+      return CPSTransformer;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/generator/EndState", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/generator/EndState";
+  var State = System.get("traceur@0.0.32/src/codegeneration/generator/State").State;
+  var EndState = function EndState() {
+    $traceurRuntime.defaultSuperCall(this, $EndState.prototype, arguments);
+  };
+  var $EndState = EndState;
+  ($traceurRuntime.createClass)(EndState, {
+    replaceState: function(oldState, newState) {
+      return new $EndState(State.replaceStateId(this.id, oldState, newState));
+    },
+    transform: function(enclosingFinally, machineEndState, reporter) {
+      return State.generateJump(enclosingFinally, machineEndState);
+    }
+  }, {}, State);
+  return {get EndState() {
+      return EndState;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/generator/AsyncTransformer", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/generator/AsyncTransformer";
+  var $__238 = Object.freeze(Object.defineProperties(["", " = $ctx.value"], {raw: {value: Object.freeze(["", " = $ctx.value"])}})),
+      $__239 = Object.freeze(Object.defineProperties(["throw $ctx.err"], {raw: {value: Object.freeze(["throw $ctx.err"])}})),
+      $__240 = Object.freeze(Object.defineProperties(["$ctx.resolve(", ")"], {raw: {value: Object.freeze(["$ctx.resolve(", ")"])}})),
+      $__241 = Object.freeze(Object.defineProperties(["$traceurRuntime.asyncWrap"], {raw: {value: Object.freeze(["$traceurRuntime.asyncWrap"])}}));
+  var AwaitState = System.get("traceur@0.0.32/src/codegeneration/generator/AwaitState").AwaitState;
+  var CPSTransformer = System.get("traceur@0.0.32/src/codegeneration/generator/CPSTransformer").CPSTransformer;
+  var EndState = System.get("traceur@0.0.32/src/codegeneration/generator/EndState").EndState;
+  var FallThroughState = System.get("traceur@0.0.32/src/codegeneration/generator/FallThroughState").FallThroughState;
+  var STATE_MACHINE = System.get("traceur@0.0.32/src/syntax/trees/ParseTreeType").STATE_MACHINE;
+  var $__243 = System.get("traceur@0.0.32/src/codegeneration/PlaceholderParser"),
+      parseExpression = $__243.parseExpression,
+      parseStatement = $__243.parseStatement,
+      parseStatements = $__243.parseStatements;
+  var State = System.get("traceur@0.0.32/src/codegeneration/generator/State").State;
+  var StateMachine = System.get("traceur@0.0.32/src/syntax/trees/StateMachine").StateMachine;
+  var VAR = System.get("traceur@0.0.32/src/syntax/TokenType").VAR;
+  var $__243 = System.get("traceur@0.0.32/src/codegeneration/ParseTreeFactory"),
+      createAssignStateStatement = $__243.createAssignStateStatement,
+      createBreakStatement = $__243.createBreakStatement,
+      createStatementList = $__243.createStatementList,
+      createUndefinedExpression = $__243.createUndefinedExpression;
+  var AsyncTransformer = function AsyncTransformer() {
+    $traceurRuntime.defaultSuperCall(this, $AsyncTransformer.prototype, arguments);
+  };
+  var $AsyncTransformer = AsyncTransformer;
+  ($traceurRuntime.createClass)(AsyncTransformer, {
+    transformYieldExpression: function(tree) {
+      this.reporter.reportError(tree.location.start, 'Async function may not have a yield expression.');
+      return tree;
+    },
+    transformAwaitStatement: function(tree) {
+      var createTaskState = this.allocateState();
+      var callbackState = this.allocateState();
+      var errbackState = this.allocateState();
+      var fallThroughState = this.allocateState();
+      var states = [];
+      var expression = this.transformAny(tree.expression);
+      states.push(new AwaitState(createTaskState, callbackState, errbackState, expression));
+      var assignment;
+      if (tree.identifier != null)
+        assignment = parseStatements($__238, tree.identifier);
+      else
+        assignment = createStatementList();
+      states.push(new FallThroughState(callbackState, fallThroughState, assignment));
+      states.push(new FallThroughState(errbackState, fallThroughState, createStatementList(parseStatement($__239))));
+      return new StateMachine(createTaskState, fallThroughState, states, []);
+    },
+    transformFinally: function(tree) {
+      var result = $traceurRuntime.superCall(this, $AsyncTransformer.prototype, "transformFinally", [tree]);
+      if (result.block.type != STATE_MACHINE) {
+        return result;
+      }
+      this.reporter.reportError(tree.location.start, 'await not permitted within a finally block.');
+      return result;
+    },
+    transformReturnStatement: function(tree) {
+      var result = tree.expression;
+      if (result == null) {
+        result = createUndefinedExpression();
+      }
+      var startState = this.allocateState();
+      var endState = this.allocateState();
+      var completeState = new FallThroughState(startState, endState, createStatementList(this.createCompleteTask_(result)));
+      var end = new EndState(endState);
+      return new StateMachine(startState, this.allocateState(), [completeState, end], []);
+    },
+    createCompleteTask_: function(result) {
+      return parseStatement($__240, result);
+    },
+    transformAsyncBody: function(tree) {
+      var runtimeFunction = parseExpression($__241);
+      return this.transformCpsFunctionBody(tree, runtimeFunction);
+    },
+    machineFallThroughStatements: function(machineEndState) {
+      return createStatementList(this.createCompleteTask_(createUndefinedExpression()), createAssignStateStatement(machineEndState), createBreakStatement());
+    }
+  }, {transformAsyncBody: function(identifierGenerator, reporter, body) {
+      return new $AsyncTransformer(identifierGenerator, reporter).transformAsyncBody(body);
+    }}, CPSTransformer);
+  ;
+  return {get AsyncTransformer() {
+      return AsyncTransformer;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/generator/ForInTransformPass", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/generator/ForInTransformPass";
+  var $__245 = System.get("traceur@0.0.32/src/syntax/trees/ParseTreeType"),
+      BLOCK = $__245.BLOCK,
+      VARIABLE_DECLARATION_LIST = $__245.VARIABLE_DECLARATION_LIST,
+      IDENTIFIER_EXPRESSION = $__245.IDENTIFIER_EXPRESSION;
+  var $__245 = System.get("traceur@0.0.32/src/syntax/PredefinedName"),
+      LENGTH = $__245.LENGTH,
+      PUSH = $__245.PUSH;
+  var TempVarTransformer = System.get("traceur@0.0.32/src/codegeneration/TempVarTransformer").TempVarTransformer;
+  var $__245 = System.get("traceur@0.0.32/src/syntax/TokenType"),
+      BANG = $__245.BANG,
+      IN = $__245.IN,
+      OPEN_ANGLE = $__245.OPEN_ANGLE,
+      PLUS_PLUS = $__245.PLUS_PLUS,
+      VAR = $__245.VAR;
+  var $__245 = System.get("traceur@0.0.32/src/codegeneration/ParseTreeFactory"),
+      createArgumentList = $__245.createArgumentList,
+      createAssignmentStatement = $__245.createAssignmentStatement,
+      createBinaryOperator = $__245.createBinaryOperator,
+      createBlock = $__245.createBlock,
+      createCallStatement = $__245.createCallStatement,
+      createContinueStatement = $__245.createContinueStatement,
+      createEmptyArrayLiteralExpression = $__245.createEmptyArrayLiteralExpression,
+      createForInStatement = $__245.createForInStatement,
+      createForStatement = $__245.createForStatement,
+      createIdentifierExpression = $__245.createIdentifierExpression,
+      createIfStatement = $__245.createIfStatement,
+      createMemberExpression = $__245.createMemberExpression,
+      createMemberLookupExpression = $__245.createMemberLookupExpression,
+      createNumberLiteral = $__245.createNumberLiteral,
+      createOperatorToken = $__245.createOperatorToken,
+      createParenExpression = $__245.createParenExpression,
+      createPostfixExpression = $__245.createPostfixExpression,
+      createUnaryExpression = $__245.createUnaryExpression,
+      createVariableDeclarationList = $__245.createVariableDeclarationList,
+      createVariableStatement = $__245.createVariableStatement;
+  var ForInTransformPass = function ForInTransformPass() {
+    $traceurRuntime.defaultSuperCall(this, $ForInTransformPass.prototype, arguments);
+  };
+  var $ForInTransformPass = ForInTransformPass;
+  ($traceurRuntime.createClass)(ForInTransformPass, {transformForInStatement: function(original) {
+      var $__246;
+      var tree = original;
+      var bodyStatements = [];
+      var body = this.transformAny(tree.body);
+      if (body.type == BLOCK) {
+        ($__246 = bodyStatements).push.apply($__246, $traceurRuntime.toObject(body.statements));
+      } else {
+        bodyStatements.push(body);
+      }
+      var elements = [];
+      var keys = this.getTempIdentifier();
+      elements.push(createVariableStatement(VAR, keys, createEmptyArrayLiteralExpression()));
+      var collection = this.getTempIdentifier();
+      elements.push(createVariableStatement(VAR, collection, tree.collection));
+      var p = this.getTempIdentifier();
+      elements.push(createForInStatement(createVariableDeclarationList(VAR, p, null), createIdentifierExpression(collection), createCallStatement(createMemberExpression(keys, PUSH), createArgumentList(createIdentifierExpression(p)))));
+      var i = this.getTempIdentifier();
+      var lookup = createMemberLookupExpression(createIdentifierExpression(keys), createIdentifierExpression(i));
+      var originalKey,
+          assignOriginalKey;
+      if (tree.initialiser.type == VARIABLE_DECLARATION_LIST) {
+        var decList = tree.initialiser;
+        originalKey = createIdentifierExpression(decList.declarations[0].lvalue);
+        assignOriginalKey = createVariableStatement(decList.declarationType, originalKey.identifierToken, lookup);
+      } else if (tree.initialiser.type == IDENTIFIER_EXPRESSION) {
+        originalKey = tree.initialiser;
+        assignOriginalKey = createAssignmentStatement(tree.initialiser, lookup);
+      } else {
+        throw new Error('Invalid left hand side of for in loop');
+      }
+      var innerBlock = [];
+      innerBlock.push(assignOriginalKey);
+      innerBlock.push(createIfStatement(createUnaryExpression(createOperatorToken(BANG), createParenExpression(createBinaryOperator(originalKey, createOperatorToken(IN), createIdentifierExpression(collection)))), createContinueStatement(), null));
+      ($__246 = innerBlock).push.apply($__246, $traceurRuntime.toObject(bodyStatements));
+      elements.push(createForStatement(createVariableDeclarationList(VAR, i, createNumberLiteral(0)), createBinaryOperator(createIdentifierExpression(i), createOperatorToken(OPEN_ANGLE), createMemberExpression(keys, LENGTH)), createPostfixExpression(createIdentifierExpression(i), createOperatorToken(PLUS_PLUS)), createBlock(innerBlock)));
+      return createBlock(elements);
+    }}, {}, TempVarTransformer);
+  return {get ForInTransformPass() {
+      return ForInTransformPass;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/generator/YieldState", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/generator/YieldState";
+  var $__247 = Object.freeze(Object.defineProperties(["return ", ""], {raw: {value: Object.freeze(["return ", ""])}}));
+  var CURRENT = System.get("traceur@0.0.32/src/syntax/PredefinedName").CURRENT;
+  var State = System.get("traceur@0.0.32/src/codegeneration/generator/State").State;
+  var $__249 = System.get("traceur@0.0.32/src/codegeneration/ParseTreeFactory"),
+      createAssignmentStatement = $__249.createAssignmentStatement,
+      createIdentifierExpression = $__249.createIdentifierExpression,
+      createMemberExpression = $__249.createMemberExpression,
+      createReturnStatement = $__249.createReturnStatement,
+      createThisExpression = $__249.createThisExpression,
+      createTrueLiteral = $__249.createTrueLiteral;
+  var parseStatement = System.get("traceur@0.0.32/src/codegeneration/PlaceholderParser").parseStatement;
+  var YieldState = function YieldState(id, fallThroughState, expression) {
+    $traceurRuntime.superCall(this, $YieldState.prototype, "constructor", [id]);
+    this.fallThroughState = fallThroughState;
+    this.expression = expression;
+  };
+  var $YieldState = YieldState;
+  ($traceurRuntime.createClass)(YieldState, {
+    replaceState: function(oldState, newState) {
+      return new this.constructor(State.replaceStateId(this.id, oldState, newState), State.replaceStateId(this.fallThroughState, oldState, newState), this.expression);
+    },
+    transform: function(enclosingFinally, machineEndState, reporter) {
+      return $traceurRuntime.spread(State.generateAssignState(enclosingFinally, this.fallThroughState), [parseStatement($__247, this.expression)]);
+    }
+  }, {}, State);
+  return {get YieldState() {
+      return YieldState;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/generator/ReturnState", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/generator/ReturnState";
+  var $__250 = Object.freeze(Object.defineProperties(["$ctx.returnValue = ", ""], {raw: {value: Object.freeze(["$ctx.returnValue = ", ""])}}));
+  var $__252 = System.get("traceur@0.0.32/src/semantics/util"),
+      isUndefined = $__252.isUndefined,
+      isVoidExpression = $__252.isVoidExpression;
+  var YieldState = System.get("traceur@0.0.32/src/codegeneration/generator/YieldState").YieldState;
+  var State = System.get("traceur@0.0.32/src/codegeneration/generator/State").State;
+  var $__252 = System.get("traceur@0.0.32/src/codegeneration/ParseTreeFactory"),
+      createAssignmentStatement = $__252.createAssignmentStatement,
+      createMemberExpression = $__252.createMemberExpression,
+      createThisExpression = $__252.createThisExpression;
+  var parseStatement = System.get("traceur@0.0.32/src/codegeneration/PlaceholderParser").parseStatement;
+  var ReturnState = function ReturnState() {
+    $traceurRuntime.defaultSuperCall(this, $ReturnState.prototype, arguments);
+  };
+  var $ReturnState = ReturnState;
+  ($traceurRuntime.createClass)(ReturnState, {transform: function(enclosingFinally, machineEndState, reporter) {
+      var $__253;
+      var e = this.expression;
+      var statements = [];
+      if (e && !isUndefined(e) && !isVoidExpression(e))
+        statements.push(parseStatement($__250, this.expression));
+      ($__253 = statements).push.apply($__253, $traceurRuntime.toObject(State.generateJump(enclosingFinally, machineEndState)));
+      return statements;
+    }}, {}, YieldState);
+  return {get ReturnState() {
+      return ReturnState;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/generator/isYieldAssign", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/generator/isYieldAssign";
+  var $__254 = System.get("traceur@0.0.32/src/syntax/trees/ParseTreeType"),
+      BINARY_OPERATOR = $__254.BINARY_OPERATOR,
+      YIELD_EXPRESSION = $__254.YIELD_EXPRESSION;
+  function isYieldAssign(tree) {
+    return tree.type === BINARY_OPERATOR && tree.operator.isAssignmentOperator() && tree.right.type === YIELD_EXPRESSION && tree.left.isLeftHandSideExpression();
+  }
+  var $__default = isYieldAssign;
+  return {get default() {
+      return $__default;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/generator/YieldFinder", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/generator/YieldFinder";
+  var ParseTreeVisitor = System.get("traceur@0.0.32/src/syntax/ParseTreeVisitor").ParseTreeVisitor;
+  var YieldFinder = function YieldFinder(tree) {
+    this.hasYield = false;
+    this.hasYieldFor = false;
+    this.hasForIn = false;
+    this.hasAwait = false;
+    this.visitAny(tree);
+  };
+  var $YieldFinder = YieldFinder;
+  ($traceurRuntime.createClass)(YieldFinder, {
+    hasAnyGenerator: function() {
+      return this.hasYield || this.hasAwait;
+    },
+    visitYieldExpression: function(tree) {
+      this.hasYield = true;
+      this.hasYieldFor = tree.isYieldFor;
+    },
+    visitAwaitStatement: function(tree) {
+      this.hasAwait = true;
+    },
+    visitForInStatement: function(tree) {
+      this.hasForIn = true;
+      $traceurRuntime.superCall(this, $YieldFinder.prototype, "visitForInStatement", [tree]);
+    },
+    visitFunctionDeclaration: function(tree) {},
+    visitFunctionExpression: function(tree) {},
+    visitSetAccessor: function(tree) {},
+    visitGetAccessor: function(tree) {}
+  }, {}, ParseTreeVisitor);
+  return {get YieldFinder() {
+      return YieldFinder;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/generator/scopeContainsYield", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/generator/scopeContainsYield";
+  var YieldFinder = System.get("traceur@0.0.32/src/codegeneration/generator/YieldFinder").YieldFinder;
+  function scopeContainsYield(tree) {
+    var visitor = new YieldFinder(tree);
+    return visitor.hasYield || visitor.hasYieldFor || visitor.hasAwait;
+  }
+  var $__default = scopeContainsYield;
+  return {get default() {
+      return $__default;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/generator/GeneratorTransformer", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/generator/GeneratorTransformer";
+  var $__258 = Object.freeze(Object.defineProperties(["\n        ", " = ", "[Symbol.iterator]();\n        // received = void 0;\n        $ctx.sent = void 0;\n        // send = true; // roughly equivalent\n        $ctx.action = 'next';\n\n        for (;;) {\n          ", " = ", "[$ctx.action]($ctx.sentIgnoreThrow);\n          if (", ".done) {\n            $ctx.sent = ", ".value;\n            break;\n          }\n          ", ";\n        }"], {raw: {value: Object.freeze(["\n        ", " = ", "[Symbol.iterator]();\n        // received = void 0;\n        $ctx.sent = void 0;\n        // send = true; // roughly equivalent\n        $ctx.action = 'next';\n\n        for (;;) {\n          ", " = ", "[$ctx.action]($ctx.sentIgnoreThrow);\n          if (", ".done) {\n            $ctx.sent = ", ".value;\n            break;\n          }\n          ", ";\n        }"])}})),
+      $__259 = Object.freeze(Object.defineProperties(["$ctx.sentIgnoreThrow"], {raw: {value: Object.freeze(["$ctx.sentIgnoreThrow"])}})),
+      $__260 = Object.freeze(Object.defineProperties(["$ctx.sent"], {raw: {value: Object.freeze(["$ctx.sent"])}})),
+      $__261 = Object.freeze(Object.defineProperties(["$ctx.maybeThrow()"], {raw: {value: Object.freeze(["$ctx.maybeThrow()"])}})),
+      $__262 = Object.freeze(Object.defineProperties(["$traceurRuntime.generatorWrap"], {raw: {value: Object.freeze(["$traceurRuntime.generatorWrap"])}}));
+  var CPSTransformer = System.get("traceur@0.0.32/src/codegeneration/generator/CPSTransformer").CPSTransformer;
+  var $__264 = System.get("traceur@0.0.32/src/syntax/trees/ParseTreeType"),
+      STATE_MACHINE = $__264.STATE_MACHINE,
+      YIELD_EXPRESSION = $__264.YIELD_EXPRESSION;
+  var $__264 = System.get("traceur@0.0.32/src/syntax/trees/ParseTrees"),
+      BinaryOperator = $__264.BinaryOperator,
+      ExpressionStatement = $__264.ExpressionStatement;
+  var ExplodeExpressionTransformer = System.get("traceur@0.0.32/src/codegeneration/ExplodeExpressionTransformer").ExplodeExpressionTransformer;
+  var FallThroughState = System.get("traceur@0.0.32/src/codegeneration/generator/FallThroughState").FallThroughState;
+  var ReturnState = System.get("traceur@0.0.32/src/codegeneration/generator/ReturnState").ReturnState;
+  var State = System.get("traceur@0.0.32/src/codegeneration/generator/State").State;
+  var StateMachine = System.get("traceur@0.0.32/src/syntax/trees/StateMachine").StateMachine;
+  var YieldState = System.get("traceur@0.0.32/src/codegeneration/generator/YieldState").YieldState;
+  var $__264 = System.get("traceur@0.0.32/src/codegeneration/ParseTreeFactory"),
+      createAssignStateStatement = $__264.createAssignStateStatement,
+      createFunctionBody = $__264.createFunctionBody,
+      id = $__264.createIdentifierExpression,
+      createMemberExpression = $__264.createMemberExpression,
+      createStatementList = $__264.createStatementList,
+      createUndefinedExpression = $__264.createUndefinedExpression,
+      createYieldStatement = $__264.createYieldStatement;
+  var isYieldAssign = System.get("traceur@0.0.32/src/codegeneration/generator/isYieldAssign").default;
+  var $__264 = System.get("traceur@0.0.32/src/codegeneration/PlaceholderParser"),
+      parseExpression = $__264.parseExpression,
+      parseStatement = $__264.parseStatement,
+      parseStatements = $__264.parseStatements;
+  var scopeContainsYield = System.get("traceur@0.0.32/src/codegeneration/generator/scopeContainsYield").default;
+  var GeneratorTransformer = function GeneratorTransformer(identifierGenerator, reporter) {
+    $traceurRuntime.superCall(this, $GeneratorTransformer.prototype, "constructor", [identifierGenerator, reporter]);
+    this.shouldAppendThrowCloseState_ = true;
+  };
+  var $GeneratorTransformer = GeneratorTransformer;
+  ($traceurRuntime.createClass)(GeneratorTransformer, {
+    expressionNeedsStateMachine: function(tree) {
+      if (tree === null)
+        return false;
+      return scopeContainsYield(tree);
+    },
+    transformYieldExpression_: function(tree) {
+      var $__264;
+      var expression,
+          machine;
+      if (this.expressionNeedsStateMachine(tree.expression)) {
+        (($__264 = this.expressionToStateMachine(tree.expression), expression = $__264.expression, machine = $__264.machine, $__264));
+      } else {
+        expression = this.transformAny(tree.expression);
+        if (!expression)
+          expression = createUndefinedExpression();
+      }
+      if (tree.isYieldFor)
+        return this.transformYieldForExpression_(expression, machine);
+      var startState = this.allocateState();
+      var fallThroughState = this.allocateState();
+      var yieldMachine = this.stateToStateMachine_(new YieldState(startState, fallThroughState, this.transformAny(expression)), fallThroughState);
+      if (machine)
+        yieldMachine = machine.append(yieldMachine);
+      if (this.shouldAppendThrowCloseState_)
+        yieldMachine = yieldMachine.append(this.createThrowCloseState_());
+      return yieldMachine;
+    },
+    transformYieldForExpression_: function(expression) {
+      var machine = arguments[1];
+      var gName = this.getTempIdentifier();
+      this.addMachineVariable(gName);
+      var g = id(gName);
+      var nextName = this.getTempIdentifier();
+      this.addMachineVariable(nextName);
+      var next = id(nextName);
+      var statements = parseStatements($__258, g, expression, next, g, next, next, createYieldStatement(createMemberExpression(next, 'value')));
+      var shouldAppendThrowCloseState = this.shouldAppendThrowCloseState_;
+      this.shouldAppendThrowCloseState_ = false;
+      statements = this.transformList(statements);
+      var yieldMachine = this.transformStatementList_(statements);
+      this.shouldAppendThrowCloseState_ = shouldAppendThrowCloseState;
+      if (machine)
+        yieldMachine = machine.append(yieldMachine);
+      return yieldMachine;
+    },
+    transformYieldExpression: function(tree) {
+      this.reporter.reportError(tree.location.start, 'Only \'a = yield b\' and \'var a = yield b\' currently supported.');
+      return tree;
+    },
+    transformYieldAssign_: function(tree) {
+      var shouldAppendThrowCloseState = this.shouldAppendThrowCloseState_;
+      this.shouldAppendThrowCloseState_ = false;
+      var machine = this.transformYieldExpression_(tree.right);
+      var left = this.transformAny(tree.left);
+      var sentExpression = tree.right.isYieldFor ? parseExpression($__259) : parseExpression($__260);
+      var statement = new ExpressionStatement(tree.location, new BinaryOperator(tree.location, left, tree.operator, sentExpression));
+      var assignMachine = this.statementToStateMachine_(statement);
+      this.shouldAppendThrowCloseState_ = shouldAppendThrowCloseState;
+      return machine.append(assignMachine);
+    },
+    createThrowCloseState_: function() {
+      return this.statementToStateMachine_(parseStatement($__261));
+    },
+    transformExpressionStatement: function(tree) {
+      var expression = tree.expression;
+      if (expression.type === YIELD_EXPRESSION)
+        return this.transformYieldExpression_(expression);
+      if (isYieldAssign(expression))
+        return this.transformYieldAssign_(expression);
+      if (this.expressionNeedsStateMachine(expression)) {
+        return this.expressionToStateMachine(expression).machine;
+      }
+      return $traceurRuntime.superCall(this, $GeneratorTransformer.prototype, "transformExpressionStatement", [tree]);
+    },
+    transformAwaitStatement: function(tree) {
+      this.reporter.reportError(tree.location.start, 'Generator function may not have an await statement.');
+      return tree;
+    },
+    transformReturnStatement: function(tree) {
+      var $__264;
+      var expression,
+          machine;
+      if (this.expressionNeedsStateMachine(tree.expression))
+        (($__264 = this.expressionToStateMachine(tree.expression), expression = $__264.expression, machine = $__264.machine, $__264));
+      else
+        expression = tree.expression;
+      var startState = this.allocateState();
+      var fallThroughState = this.allocateState();
+      var returnMachine = this.stateToStateMachine_(new ReturnState(startState, fallThroughState, this.transformAny(expression)), fallThroughState);
+      if (machine)
+        return machine.append(returnMachine);
+      return returnMachine;
+    },
+    transformGeneratorBody: function(tree) {
+      var runtimeFunction = parseExpression($__262);
+      return this.transformCpsFunctionBody(tree, runtimeFunction);
+    },
+    machineFallThroughStatements: function(machineEndState) {
+      return createStatementList(createAssignStateStatement(machineEndState));
+    }
+  }, {transformGeneratorBody: function(identifierGenerator, reporter, body) {
+      return new $GeneratorTransformer(identifierGenerator, reporter).transformGeneratorBody(body);
+    }}, CPSTransformer);
+  ;
+  return {get GeneratorTransformer() {
+      return GeneratorTransformer;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/GeneratorTransformPass", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/GeneratorTransformPass";
+  var AsyncTransformer = System.get("traceur@0.0.32/src/codegeneration/generator/AsyncTransformer").AsyncTransformer;
+  var ForInTransformPass = System.get("traceur@0.0.32/src/codegeneration/generator/ForInTransformPass").ForInTransformPass;
+  var $__266 = System.get("traceur@0.0.32/src/syntax/trees/ParseTrees"),
+      GetAccessor = $__266.GetAccessor,
+      SetAccessor = $__266.SetAccessor;
+  var GeneratorTransformer = System.get("traceur@0.0.32/src/codegeneration/generator/GeneratorTransformer").GeneratorTransformer;
+  var ParseTreeVisitor = System.get("traceur@0.0.32/src/syntax/ParseTreeVisitor").ParseTreeVisitor;
+  var parseStatement = System.get("traceur@0.0.32/src/codegeneration/PlaceholderParser").parseStatement;
+  var TempVarTransformer = System.get("traceur@0.0.32/src/codegeneration/TempVarTransformer").TempVarTransformer;
+  var EQUAL = System.get("traceur@0.0.32/src/syntax/TokenType").EQUAL;
+  var $__266 = System.get("traceur@0.0.32/src/syntax/trees/ParseTreeType"),
+      BINARY_OPERATOR = $__266.BINARY_OPERATOR,
+      COMMA_EXPRESSION = $__266.COMMA_EXPRESSION,
+      PAREN_EXPRESSION = $__266.PAREN_EXPRESSION,
+      YIELD_EXPRESSION = $__266.YIELD_EXPRESSION;
+  var $__266 = System.get("traceur@0.0.32/src/syntax/trees/ParseTrees"),
+      FunctionDeclaration = $__266.FunctionDeclaration,
+      FunctionExpression = $__266.FunctionExpression;
+  var YieldFinder = System.get("traceur@0.0.32/src/codegeneration/generator/YieldFinder").YieldFinder;
+  var $__266 = System.get("traceur@0.0.32/src/codegeneration/ParseTreeFactory"),
+      createAssignmentExpression = $__266.createAssignmentExpression,
+      createAssignmentStatement = $__266.createAssignmentStatement,
+      createBlock = $__266.createBlock,
+      createCommaExpression = $__266.createCommaExpression,
+      createExpressionStatement = $__266.createExpressionStatement,
+      id = $__266.createIdentifierExpression,
+      createMemberExpression = $__266.createMemberExpression,
+      createVariableDeclaration = $__266.createVariableDeclaration,
+      createVariableDeclarationList = $__266.createVariableDeclarationList,
+      createVariableStatement = $__266.createVariableStatement,
+      createYieldStatement = $__266.createYieldStatement;
+  var isYieldAssign = System.get("traceur@0.0.32/src/codegeneration/generator/isYieldAssign").default;
+  var $__266 = System.get("traceur@0.0.32/src/options"),
+      transformOptions = $__266.transformOptions,
+      options = $__266.options;
+  var GeneratorTransformPass = function GeneratorTransformPass(identifierGenerator, reporter) {
+    $traceurRuntime.superCall(this, $GeneratorTransformPass.prototype, "constructor", [identifierGenerator]);
+    this.reporter_ = reporter;
+  };
+  var $GeneratorTransformPass = GeneratorTransformPass;
+  ($traceurRuntime.createClass)(GeneratorTransformPass, {
+    transformFunctionDeclaration: function(tree) {
+      return this.transformFunction_(tree, FunctionDeclaration);
+    },
+    transformFunctionExpression: function(tree) {
+      return this.transformFunction_(tree, FunctionExpression);
+    },
+    transformFunction_: function(tree, constructor) {
+      var body = this.transformBody_(tree.functionBody, tree.isGenerator);
+      if (body === tree.functionBody)
+        return tree;
+      var isGenerator = false;
+      return new constructor(null, tree.name, isGenerator, tree.formalParameterList, tree.typeAnnotation, tree.annotations, body);
+    },
+    transformBody_: function(tree, isGenerator) {
+      var finder;
+      var body = $traceurRuntime.superCall(this, $GeneratorTransformPass.prototype, "transformFunctionBody", [tree]);
+      if (isGenerator || transformOptions.deferredFunctions) {
+        finder = new YieldFinder(tree);
+        if (!(finder.hasYield || isGenerator || finder.hasAwait))
+          return body;
+      } else if (!isGenerator) {
+        return body;
+      }
+      if (finder.hasForIn && (transformOptions.generators || transformOptions.deferredFunctions)) {
+        body = new ForInTransformPass(this.identifierGenerator).transformAny(body);
+      }
+      if (finder.hasYield || isGenerator) {
+        if (transformOptions.generators) {
+          body = GeneratorTransformer.transformGeneratorBody(this.identifierGenerator, this.reporter_, body);
+        }
+      } else if (transformOptions.deferredFunctions) {
+        body = AsyncTransformer.transformAsyncBody(this.identifierGenerator, this.reporter_, body);
+      }
+      return body;
+    },
+    transformGetAccessor: function(tree) {
+      var body = this.transformBody_(tree.body);
+      if (body === tree.body)
+        return tree;
+      return new GetAccessor(tree.location, tree.isStatic, tree.name, tree.typeAnnotation, tree.annotations, body);
+    },
+    transformSetAccessor: function(tree) {
+      var body = this.transformBody_(tree.body);
+      if (body === tree.body)
+        return tree;
+      return new SetAccessor(tree.location, tree.isStatic, tree.name, tree.parameter, tree.annotations, body);
+    }
+  }, {}, TempVarTransformer);
+  return {get GeneratorTransformPass() {
+      return GeneratorTransformPass;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/InlineModuleTransformer", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/InlineModuleTransformer";
+  var VAR = System.get("traceur@0.0.32/src/syntax/TokenType").VAR;
+  var assert = System.get("traceur@0.0.32/src/util/assert").assert;
+  var ModuleTransformer = System.get("traceur@0.0.32/src/codegeneration/ModuleTransformer").ModuleTransformer;
+  var $__268 = System.get("traceur@0.0.32/src/codegeneration/ParseTreeFactory"),
+      createBindingIdentifier = $__268.createBindingIdentifier,
+      createEmptyStatement = $__268.createEmptyStatement,
+      createFunctionBody = $__268.createFunctionBody,
+      createImmediatelyInvokedFunctionExpression = $__268.createImmediatelyInvokedFunctionExpression,
+      createScopedExpression = $__268.createScopedExpression,
+      createVariableStatement = $__268.createVariableStatement;
+  var globalThis = System.get("traceur@0.0.32/src/codegeneration/globalThis").default;
+  var scopeContainsThis = System.get("traceur@0.0.32/src/codegeneration/scopeContainsThis").default;
+  var InlineModuleTransformer = function InlineModuleTransformer() {
+    $traceurRuntime.defaultSuperCall(this, $InlineModuleTransformer.prototype, arguments);
+  };
+  var $InlineModuleTransformer = InlineModuleTransformer;
+  ($traceurRuntime.createClass)(InlineModuleTransformer, {
+    wrapModule: function(statements) {
+      assert(this.moduleName);
+      var idName = this.getTempVarNameForModuleName(this.moduleName);
+      var body = createFunctionBody(statements);
+      var moduleExpression;
+      if (statements.some(scopeContainsThis)) {
+        moduleExpression = createScopedExpression(body, globalThis());
+      } else {
+        moduleExpression = createImmediatelyInvokedFunctionExpression(body);
+      }
+      return [createVariableStatement(VAR, idName, moduleExpression)];
+    },
+    transformNamedExport: function(tree) {
+      return createEmptyStatement();
+    },
+    transformModuleSpecifier: function(tree) {
+      return createBindingIdentifier(this.getTempVarNameForModuleSpecifier(tree));
+    }
+  }, {}, ModuleTransformer);
+  return {get InlineModuleTransformer() {
+      return InlineModuleTransformer;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/InstantiateModuleTransformer", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/InstantiateModuleTransformer";
+  var $__269 = Object.freeze(Object.defineProperties(["function(", ") {\n      ", "\n    }"], {raw: {value: Object.freeze(["function(", ") {\n      ", "\n    }"])}})),
+      $__270 = Object.freeze(Object.defineProperties(["", ".bind(", ")"], {raw: {value: Object.freeze(["", ".bind(", ")"])}})),
+      $__271 = Object.freeze(Object.defineProperties(["System.register(", ", ", ", ", ");"], {raw: {value: Object.freeze(["System.register(", ", ", ", ", ");"])}})),
+      $__272 = Object.freeze(Object.defineProperties(["System.get(", ")"], {raw: {value: Object.freeze(["System.get(", ")"])}}));
+  var assert = System.get("traceur@0.0.32/src/util/assert").assert;
+  var createIdentifierExpression = System.get("traceur@0.0.32/src/codegeneration/ParseTreeFactory").createIdentifierExpression;
+  var globalThis = System.get("traceur@0.0.32/src/codegeneration/globalThis").default;
+  var ModuleTransformer = System.get("traceur@0.0.32/src/codegeneration/ModuleTransformer").ModuleTransformer;
+  var $__274 = System.get("traceur@0.0.32/src/codegeneration/PlaceholderParser"),
+      parseExpression = $__274.parseExpression,
+      parseStatements = $__274.parseStatements;
+  var scopeContainsThis = System.get("traceur@0.0.32/src/codegeneration/scopeContainsThis").default;
+  var InstantiateModuleTransformer = function InstantiateModuleTransformer(identifierGenerator) {
+    $traceurRuntime.superCall(this, $InstantiateModuleTransformer.prototype, "constructor", [identifierGenerator]);
+    this.dependencies = [];
+  };
+  var $InstantiateModuleTransformer = InstantiateModuleTransformer;
+  ($traceurRuntime.createClass)(InstantiateModuleTransformer, {
+    wrapModule: function(statements) {
+      var depPaths = this.dependencies.map((function(dep) {
+        return dep.path;
+      }));
+      var depLocals = this.dependencies.map((function(dep) {
+        return dep.local;
+      }));
+      var hasTopLevelThis = statements.some(scopeContainsThis);
+      var func = parseExpression($__269, depLocals, statements);
+      if (hasTopLevelThis)
+        func = parseExpression($__270, func, globalThis());
+      return parseStatements($__271, this.moduleName, depPaths, func);
+    },
+    transformModuleSpecifier: function(tree) {
+      assert(this.moduleName);
+      var name = tree.token.processedValue;
+      var localName = this.getTempIdentifier();
+      this.dependencies.push({
+        path: tree.token,
+        local: localName
+      });
+      var localIdentifier = createIdentifierExpression(localName);
+      return parseExpression($__272, localIdentifier);
+    }
+  }, {}, ModuleTransformer);
+  return {get InstantiateModuleTransformer() {
+      return InstantiateModuleTransformer;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/MultiTransformer", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/MultiTransformer";
+  var ParseTreeValidator = System.get("traceur@0.0.32/src/syntax/ParseTreeValidator").ParseTreeValidator;
+  var MultiTransformer = function MultiTransformer(reporter, validate) {
+    this.reporter_ = reporter;
+    this.validate_ = validate;
+    this.treeTransformers_ = [];
+  };
+  ($traceurRuntime.createClass)(MultiTransformer, {
+    append: function(treeTransformer) {
+      this.treeTransformers_.push(treeTransformer);
+    },
+    transform: function(tree) {
+      var reporter = this.reporter_;
+      var validate = this.validate_;
+      this.treeTransformers_.every((function(transformTree) {
+        tree = transformTree(tree);
+        if (reporter.hadError())
+          return false;
+        if (validate)
+          ParseTreeValidator.validate(tree);
+        return true;
+      }));
+      return tree;
+    }
+  }, {});
+  return {get MultiTransformer() {
+      return MultiTransformer;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/NumericLiteralTransformer", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/NumericLiteralTransformer";
+  var ParseTreeTransformer = System.get("traceur@0.0.32/src/codegeneration/ParseTreeTransformer").ParseTreeTransformer;
+  var $__278 = System.get("traceur@0.0.32/src/syntax/trees/ParseTrees"),
+      LiteralExpression = $__278.LiteralExpression,
+      LiteralPropertyName = $__278.LiteralPropertyName;
+  var LiteralToken = System.get("traceur@0.0.32/src/syntax/LiteralToken").LiteralToken;
+  var NUMBER = System.get("traceur@0.0.32/src/syntax/TokenType").NUMBER;
+  function needsTransform(token) {
+    return token.type === NUMBER && /^0[bBoO]/.test(token.value);
+  }
+  function transformToken(token) {
+    return new LiteralToken(NUMBER, String(token.processedValue), token.location);
+  }
+  var NumericLiteralTransformer = function NumericLiteralTransformer() {
+    $traceurRuntime.defaultSuperCall(this, $NumericLiteralTransformer.prototype, arguments);
+  };
+  var $NumericLiteralTransformer = NumericLiteralTransformer;
+  ($traceurRuntime.createClass)(NumericLiteralTransformer, {
+    transformLiteralExpression: function(tree) {
+      var token = tree.literalToken;
+      if (needsTransform(token))
+        return new LiteralExpression(tree.location, transformToken(token));
+      return tree;
+    },
+    transformLiteralPropertyName: function(tree) {
+      var token = tree.literalToken;
+      if (needsTransform(token))
+        return new LiteralPropertyName(tree.location, transformToken(token));
+      return tree;
+    }
+  }, {}, ParseTreeTransformer);
+  return {get NumericLiteralTransformer() {
+      return NumericLiteralTransformer;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/ObjectLiteralTransformer", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/ObjectLiteralTransformer";
+  var FindVisitor = System.get("traceur@0.0.32/src/codegeneration/FindVisitor").FindVisitor;
+  var $__280 = System.get("traceur@0.0.32/src/syntax/trees/ParseTrees"),
+      FormalParameterList = $__280.FormalParameterList,
+      FunctionExpression = $__280.FunctionExpression,
+      IdentifierExpression = $__280.IdentifierExpression,
+      LiteralExpression = $__280.LiteralExpression;
+  var TempVarTransformer = System.get("traceur@0.0.32/src/codegeneration/TempVarTransformer").TempVarTransformer;
+  var $__280 = System.get("traceur@0.0.32/src/syntax/TokenType"),
+      IDENTIFIER = $__280.IDENTIFIER,
+      STRING = $__280.STRING;
+  var $__280 = System.get("traceur@0.0.32/src/syntax/trees/ParseTreeType"),
+      COMPUTED_PROPERTY_NAME = $__280.COMPUTED_PROPERTY_NAME,
+      LITERAL_PROPERTY_NAME = $__280.LITERAL_PROPERTY_NAME;
+  var $__280 = System.get("traceur@0.0.32/src/codegeneration/ParseTreeFactory"),
+      createAssignmentExpression = $__280.createAssignmentExpression,
+      createCommaExpression = $__280.createCommaExpression,
+      createDefineProperty = $__280.createDefineProperty,
+      createEmptyParameterList = $__280.createEmptyParameterList,
+      createFunctionExpression = $__280.createFunctionExpression,
+      createIdentifierExpression = $__280.createIdentifierExpression,
+      createObjectCreate = $__280.createObjectCreate,
+      createObjectLiteralExpression = $__280.createObjectLiteralExpression,
+      createParenExpression = $__280.createParenExpression,
+      createPropertyNameAssignment = $__280.createPropertyNameAssignment,
+      createStringLiteral = $__280.createStringLiteral;
+  var propName = System.get("traceur@0.0.32/src/staticsemantics/PropName").propName;
+  var transformOptions = System.get("traceur@0.0.32/src/options").transformOptions;
+  var FindAdvancedProperty = function FindAdvancedProperty(tree) {
+    this.protoExpression = null;
+    $traceurRuntime.superCall(this, $FindAdvancedProperty.prototype, "constructor", [tree, true]);
+  };
+  var $FindAdvancedProperty = FindAdvancedProperty;
+  ($traceurRuntime.createClass)(FindAdvancedProperty, {
+    visitPropertyNameAssignment: function(tree) {
+      if (isProtoName(tree.name))
+        this.protoExpression = tree.value;
+      else
+        $traceurRuntime.superCall(this, $FindAdvancedProperty.prototype, "visitPropertyNameAssignment", [tree]);
+    },
+    visitComputedPropertyName: function(tree) {
+      if (transformOptions.computedPropertyNames)
+        this.found = true;
+    }
+  }, {}, FindVisitor);
+  function isProtoName(tree) {
+    return propName(tree) === '__proto__';
+  }
+  var ObjectLiteralTransformer = function ObjectLiteralTransformer(identifierGenerator) {
+    $traceurRuntime.superCall(this, $ObjectLiteralTransformer.prototype, "constructor", [identifierGenerator]);
+    this.protoExpression = null;
+    this.needsAdvancedTransform = false;
+    this.seenAccessors = null;
+  };
+  var $ObjectLiteralTransformer = ObjectLiteralTransformer;
+  ($traceurRuntime.createClass)(ObjectLiteralTransformer, {
+    findSeenAccessor_: function(name) {
+      if (name.type === COMPUTED_PROPERTY_NAME)
+        return null;
+      var s = propName(name);
+      return this.seenAccessors[s];
+    },
+    removeSeenAccessor_: function(name) {
+      if (name.type === COMPUTED_PROPERTY_NAME)
+        return;
+      var s = propName(name);
+      delete this.seenAccessors[s];
+    },
+    addSeenAccessor_: function(name, descr) {
+      if (name.type === COMPUTED_PROPERTY_NAME)
+        return;
+      var s = propName(name);
+      this.seenAccessors[s] = descr;
+    },
+    createProperty_: function(name, descr) {
+      var expression;
+      if (name.type === LITERAL_PROPERTY_NAME) {
+        if (this.needsAdvancedTransform)
+          expression = this.getPropertyName_(name);
+        else
+          expression = name;
+      } else {
+        expression = name.expression;
+      }
+      if (descr.get || descr.set) {
+        var oldAccessor = this.findSeenAccessor_(name);
+        if (oldAccessor) {
+          oldAccessor.get = descr.get || oldAccessor.get;
+          oldAccessor.set = descr.set || oldAccessor.set;
+          this.removeSeenAccessor_(name);
+          return null;
+        } else {
+          this.addSeenAccessor_(name, descr);
+        }
+      }
+      return [expression, descr];
+    },
+    getPropertyName_: function(nameTree) {
+      var token = nameTree.literalToken;
+      switch (token.type) {
+        case IDENTIFIER:
+          return createStringLiteral(token.value);
+        default:
+          if (token.isKeyword())
+            return createStringLiteral(token.type);
+          return new LiteralExpression(token.location, token);
+      }
+    },
+    transformClassDeclaration: function(tree) {
+      return tree;
+    },
+    transformClassExpression: function(tree) {
+      return tree;
+    },
+    transformObjectLiteralExpression: function(tree) {
+      var oldNeedsTransform = this.needsAdvancedTransform;
+      var oldSeenAccessors = this.seenAccessors;
+      try {
+        var finder = new FindAdvancedProperty(tree);
+        if (!finder.found) {
+          this.needsAdvancedTransform = false;
+          return $traceurRuntime.superCall(this, $ObjectLiteralTransformer.prototype, "transformObjectLiteralExpression", [tree]);
+        }
+        this.needsAdvancedTransform = true;
+        this.seenAccessors = Object.create(null);
+        var properties = this.transformList(tree.propertyNameAndValues);
+        properties = properties.filter((function(tree) {
+          return tree;
+        }));
+        var tempVar = this.addTempVar();
+        var tempVarIdentifierExpression = createIdentifierExpression(tempVar);
+        var expressions = properties.map((function(property) {
+          var expression = property[0];
+          var descr = property[1];
+          return createDefineProperty(tempVarIdentifierExpression, expression, descr);
+        }));
+        var protoExpression = this.transformAny(finder.protoExpression);
+        var objectExpression;
+        if (protoExpression)
+          objectExpression = createObjectCreate(protoExpression);
+        else
+          objectExpression = createObjectLiteralExpression([]);
+        expressions.unshift(createAssignmentExpression(tempVarIdentifierExpression, objectExpression));
+        expressions.push(tempVarIdentifierExpression);
+        return createParenExpression(createCommaExpression(expressions));
+      } finally {
+        this.needsAdvancedTransform = oldNeedsTransform;
+        this.seenAccessors = oldSeenAccessors;
+      }
+    },
+    transformPropertyNameAssignment: function(tree) {
+      if (!this.needsAdvancedTransform)
+        return $traceurRuntime.superCall(this, $ObjectLiteralTransformer.prototype, "transformPropertyNameAssignment", [tree]);
+      if (isProtoName(tree.name))
+        return null;
+      return this.createProperty_(tree.name, {
+        value: this.transformAny(tree.value),
+        configurable: true,
+        enumerable: true,
+        writable: true
+      });
+    },
+    transformGetAccessor: function(tree) {
+      if (!this.needsAdvancedTransform)
+        return $traceurRuntime.superCall(this, $ObjectLiteralTransformer.prototype, "transformGetAccessor", [tree]);
+      var body = this.transformAny(tree.body);
+      var func = createFunctionExpression(createEmptyParameterList(), body);
+      return this.createProperty_(tree.name, {
+        get: func,
+        configurable: true,
+        enumerable: true
+      });
+    },
+    transformSetAccessor: function(tree) {
+      if (!this.needsAdvancedTransform)
+        return $traceurRuntime.superCall(this, $ObjectLiteralTransformer.prototype, "transformSetAccessor", [tree]);
+      var body = this.transformAny(tree.body);
+      var parameter = this.transformAny(tree.parameter);
+      var parameterList = new FormalParameterList(parameter.location, [parameter]);
+      var func = createFunctionExpression(parameterList, body);
+      return this.createProperty_(tree.name, {
+        set: func,
+        configurable: true,
+        enumerable: true
+      });
+    },
+    transformPropertyMethodAssignment: function(tree) {
+      var func = new FunctionExpression(tree.location, null, tree.isGenerator, this.transformAny(tree.formalParameterList), tree.typeAnnotation, [], this.transformAny(tree.functionBody));
+      if (!this.needsAdvancedTransform) {
+        return createPropertyNameAssignment(tree.name, func);
+      }
+      var expression = this.transformAny(tree.name);
+      return this.createProperty_(tree.name, {
+        value: func,
+        configurable: true,
+        enumerable: true,
+        writable: true
+      });
+    },
+    transformPropertyNameShorthand: function(tree) {
+      if (!this.needsAdvancedTransform)
+        return $traceurRuntime.superCall(this, $ObjectLiteralTransformer.prototype, "transformPropertyNameShorthand", [tree]);
+      var expression = this.transformAny(tree.name);
+      return this.createProperty_(tree.name, {
+        value: new IdentifierExpression(tree.location, tree.name.identifierToken),
+        configurable: true,
+        enumerable: false,
+        writable: true
+      });
+    }
+  }, {}, TempVarTransformer);
+  return {get ObjectLiteralTransformer() {
+      return ObjectLiteralTransformer;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/PropertyNameShorthandTransformer", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/PropertyNameShorthandTransformer";
+  var $__282 = System.get("traceur@0.0.32/src/syntax/trees/ParseTrees"),
+      IdentifierExpression = $__282.IdentifierExpression,
+      LiteralPropertyName = $__282.LiteralPropertyName,
+      PropertyNameAssignment = $__282.PropertyNameAssignment;
+  var ParseTreeTransformer = System.get("traceur@0.0.32/src/codegeneration/ParseTreeTransformer").ParseTreeTransformer;
+  var PropertyNameShorthandTransformer = function PropertyNameShorthandTransformer() {
+    $traceurRuntime.defaultSuperCall(this, $PropertyNameShorthandTransformer.prototype, arguments);
+  };
+  var $PropertyNameShorthandTransformer = PropertyNameShorthandTransformer;
+  ($traceurRuntime.createClass)(PropertyNameShorthandTransformer, {transformPropertyNameShorthand: function(tree) {
+      return new PropertyNameAssignment(tree.location, new LiteralPropertyName(tree.location, tree.name), new IdentifierExpression(tree.location, tree.name));
+    }}, {}, ParseTreeTransformer);
+  return {get PropertyNameShorthandTransformer() {
+      return PropertyNameShorthandTransformer;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/RestParameterTransformer", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/RestParameterTransformer";
+  var $__283 = Object.freeze(Object.defineProperties(["\n            for (var ", " = [], ", " = ", ";\n                 ", " < arguments.length; ", "++)\n              ", "[", " - ", "] = arguments[", "];"], {raw: {value: Object.freeze(["\n            for (var ", " = [], ", " = ", ";\n                 ", " < arguments.length; ", "++)\n              ", "[", " - ", "] = arguments[", "];"])}})),
+      $__284 = Object.freeze(Object.defineProperties(["\n            for (var ", " = [], ", " = 0;\n                 ", " < arguments.length; ", "++)\n              ", "[", "] = arguments[", "];"], {raw: {value: Object.freeze(["\n            for (var ", " = [], ", " = 0;\n                 ", " < arguments.length; ", "++)\n              ", "[", "] = arguments[", "];"])}}));
+  var FormalParameterList = System.get("traceur@0.0.32/src/syntax/trees/ParseTrees").FormalParameterList;
+  var ParameterTransformer = System.get("traceur@0.0.32/src/codegeneration/ParameterTransformer").ParameterTransformer;
+  var createIdentifierToken = System.get("traceur@0.0.32/src/codegeneration/ParseTreeFactory").createIdentifierToken;
+  var parseStatement = System.get("traceur@0.0.32/src/codegeneration/PlaceholderParser").parseStatement;
+  function hasRestParameter(formalParameterList) {
+    var parameters = formalParameterList.parameters;
+    return parameters.length > 0 && parameters[parameters.length - 1].isRestParameter();
+  }
+  function getRestParameterLiteralToken(formalParameterList) {
+    var parameters = formalParameterList.parameters;
+    return parameters[parameters.length - 1].parameter.identifier.identifierToken;
+  }
+  var RestParameterTransformer = function RestParameterTransformer() {
+    $traceurRuntime.defaultSuperCall(this, $RestParameterTransformer.prototype, arguments);
+  };
+  var $RestParameterTransformer = RestParameterTransformer;
+  ($traceurRuntime.createClass)(RestParameterTransformer, {transformFormalParameterList: function(tree) {
+      var transformed = $traceurRuntime.superCall(this, $RestParameterTransformer.prototype, "transformFormalParameterList", [tree]);
+      if (hasRestParameter(transformed)) {
+        var parametersWithoutRestParam = new FormalParameterList(transformed.location, transformed.parameters.slice(0, -1));
+        var startIndex = transformed.parameters.length - 1;
+        var i = createIdentifierToken(this.getTempIdentifier());
+        var name = getRestParameterLiteralToken(transformed);
+        var loop;
+        if (startIndex) {
+          loop = parseStatement($__283, name, i, startIndex, i, i, name, i, startIndex, i);
+        } else {
+          loop = parseStatement($__284, name, i, i, i, name, i, i);
+        }
+        this.parameterStatements.push(loop);
+        return parametersWithoutRestParam;
+      }
+      return transformed;
+    }}, {}, ParameterTransformer);
+  return {get RestParameterTransformer() {
+      return RestParameterTransformer;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/SpreadTransformer", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/SpreadTransformer";
+  var $__287 = Object.freeze(Object.defineProperties(["$traceurRuntime.toObject(", ")"], {raw: {value: Object.freeze(["$traceurRuntime.toObject(", ")"])}})),
+      $__288 = Object.freeze(Object.defineProperties(["$traceurRuntime.spread(", ")"], {raw: {value: Object.freeze(["$traceurRuntime.spread(", ")"])}}));
+  var $__290 = System.get("traceur@0.0.32/src/syntax/PredefinedName"),
+      APPLY = $__290.APPLY,
+      BIND = $__290.BIND,
+      FUNCTION = $__290.FUNCTION,
+      PROTOTYPE = $__290.PROTOTYPE;
+  var $__290 = System.get("traceur@0.0.32/src/syntax/trees/ParseTreeType"),
+      MEMBER_EXPRESSION = $__290.MEMBER_EXPRESSION,
+      MEMBER_LOOKUP_EXPRESSION = $__290.MEMBER_LOOKUP_EXPRESSION,
+      SPREAD_EXPRESSION = $__290.SPREAD_EXPRESSION;
+  var TempVarTransformer = System.get("traceur@0.0.32/src/codegeneration/TempVarTransformer").TempVarTransformer;
+  var $__290 = System.get("traceur@0.0.32/src/codegeneration/ParseTreeFactory"),
+      createArgumentList = $__290.createArgumentList,
+      createArrayLiteralExpression = $__290.createArrayLiteralExpression,
+      createAssignmentExpression = $__290.createAssignmentExpression,
+      createCallExpression = $__290.createCallExpression,
+      createEmptyArgumentList = $__290.createEmptyArgumentList,
+      createIdentifierExpression = $__290.createIdentifierExpression,
+      createMemberExpression = $__290.createMemberExpression,
+      createMemberLookupExpression = $__290.createMemberLookupExpression,
+      createNewExpression = $__290.createNewExpression,
+      createNullLiteral = $__290.createNullLiteral,
+      createParenExpression = $__290.createParenExpression;
+  var parseExpression = System.get("traceur@0.0.32/src/codegeneration/PlaceholderParser").parseExpression;
+  function hasSpreadMember(trees) {
+    return trees.some((function(tree) {
+      return tree && tree.type == SPREAD_EXPRESSION;
+    }));
+  }
+  var SpreadTransformer = function SpreadTransformer() {
+    $traceurRuntime.defaultSuperCall(this, $SpreadTransformer.prototype, arguments);
+  };
+  var $SpreadTransformer = SpreadTransformer;
+  ($traceurRuntime.createClass)(SpreadTransformer, {
+    createArrayFromElements_: function(elements, needsNewArray) {
+      var length = elements.length;
+      if (length === 1 && !needsNewArray) {
+        var args = createArgumentList(this.transformAny(elements[0].expression));
+        return parseExpression($__287, args);
+      }
+      var args = [];
+      var lastArray;
+      for (var i = 0; i < length; i++) {
+        if (elements[i] && elements[i].type === SPREAD_EXPRESSION) {
+          if (lastArray) {
+            args.push(createArrayLiteralExpression(lastArray));
+            lastArray = null;
+          }
+          args.push(this.transformAny(elements[i].expression));
+        } else {
+          if (!lastArray)
+            lastArray = [];
+          lastArray.push(this.transformAny(elements[i]));
+        }
+      }
+      if (lastArray)
+        args.push(createArrayLiteralExpression(lastArray));
+      return parseExpression($__288, createArgumentList(args));
+    },
+    desugarCallSpread_: function(tree) {
+      var operand = this.transformAny(tree.operand);
+      var functionObject,
+          contextObject;
+      this.pushTempVarState();
+      if (operand.type == MEMBER_EXPRESSION) {
+        var tempIdent = createIdentifierExpression(this.addTempVar());
+        var parenExpression = createParenExpression(createAssignmentExpression(tempIdent, operand.operand));
+        var memberName = operand.memberName;
+        contextObject = tempIdent;
+        functionObject = createMemberExpression(parenExpression, memberName);
+      } else if (tree.operand.type == MEMBER_LOOKUP_EXPRESSION) {
+        var tempIdent = createIdentifierExpression(this.addTempVar());
+        var parenExpression = createParenExpression(createAssignmentExpression(tempIdent, operand.operand));
+        var memberExpression = this.transformAny(operand.memberExpression);
+        contextObject = tempIdent;
+        functionObject = createMemberLookupExpression(parenExpression, memberExpression);
+      } else {
+        contextObject = createNullLiteral();
+        functionObject = operand;
+      }
+      this.popTempVarState();
+      var arrayExpression = this.createArrayFromElements_(tree.args.args, false);
+      return createCallExpression(createMemberExpression(functionObject, APPLY), createArgumentList(contextObject, arrayExpression));
+    },
+    desugarNewSpread_: function(tree) {
+      var arrayExpression = $traceurRuntime.spread([createNullLiteral()], tree.args.args);
+      arrayExpression = this.createArrayFromElements_(arrayExpression, false);
+      return createNewExpression(createParenExpression(createCallExpression(createMemberExpression(FUNCTION, PROTOTYPE, BIND, APPLY), createArgumentList(this.transformAny(tree.operand), arrayExpression))), createEmptyArgumentList());
+    },
+    transformArrayLiteralExpression: function(tree) {
+      if (hasSpreadMember(tree.elements)) {
+        return this.createArrayFromElements_(tree.elements, true);
+      }
+      return $traceurRuntime.superCall(this, $SpreadTransformer.prototype, "transformArrayLiteralExpression", [tree]);
+    },
+    transformCallExpression: function(tree) {
+      if (hasSpreadMember(tree.args.args)) {
+        return this.desugarCallSpread_(tree);
+      }
+      return $traceurRuntime.superCall(this, $SpreadTransformer.prototype, "transformCallExpression", [tree]);
+    },
+    transformNewExpression: function(tree) {
+      if (tree.args != null && hasSpreadMember(tree.args.args)) {
+        return this.desugarNewSpread_(tree);
+      }
+      return $traceurRuntime.superCall(this, $SpreadTransformer.prototype, "transformNewExpression", [tree]);
+    }
+  }, {}, TempVarTransformer);
+  return {get SpreadTransformer() {
+      return SpreadTransformer;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/SymbolTransformer", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/SymbolTransformer";
+  var $__291 = Object.freeze(Object.defineProperties(["$traceurRuntime.toProperty(", ") in ", ""], {raw: {value: Object.freeze(["$traceurRuntime.toProperty(", ") in ", ""])}})),
+      $__292 = Object.freeze(Object.defineProperties(["$traceurRuntime.setProperty(", ",\n          ", ", ", ")"], {raw: {value: Object.freeze(["$traceurRuntime.setProperty(", ",\n          ", ", ", ")"])}})),
+      $__293 = Object.freeze(Object.defineProperties(["", "[$traceurRuntime.toProperty(", ")]"], {raw: {value: Object.freeze(["", "[$traceurRuntime.toProperty(", ")]"])}})),
+      $__294 = Object.freeze(Object.defineProperties(["$traceurRuntime.typeof(", ")"], {raw: {value: Object.freeze(["$traceurRuntime.typeof(", ")"])}})),
+      $__295 = Object.freeze(Object.defineProperties(["(typeof ", " === 'undefined' ?\n          'undefined' : ", ")"], {raw: {value: Object.freeze(["(typeof ", " === 'undefined' ?\n          'undefined' : ", ")"])}}));
+  var $__297 = System.get("traceur@0.0.32/src/syntax/trees/ParseTrees"),
+      BinaryOperator = $__297.BinaryOperator,
+      MemberLookupExpression = $__297.MemberLookupExpression,
+      UnaryExpression = $__297.UnaryExpression;
+  var ExplodeExpressionTransformer = System.get("traceur@0.0.32/src/codegeneration/ExplodeExpressionTransformer").ExplodeExpressionTransformer;
+  var $__297 = System.get("traceur@0.0.32/src/syntax/trees/ParseTreeType"),
+      IDENTIFIER_EXPRESSION = $__297.IDENTIFIER_EXPRESSION,
+      LITERAL_EXPRESSION = $__297.LITERAL_EXPRESSION,
+      MEMBER_LOOKUP_EXPRESSION = $__297.MEMBER_LOOKUP_EXPRESSION,
+      UNARY_EXPRESSION = $__297.UNARY_EXPRESSION;
+  var TempVarTransformer = System.get("traceur@0.0.32/src/codegeneration/TempVarTransformer").TempVarTransformer;
+  var $__297 = System.get("traceur@0.0.32/src/syntax/TokenType"),
+      EQUAL = $__297.EQUAL,
+      EQUAL_EQUAL = $__297.EQUAL_EQUAL,
+      EQUAL_EQUAL_EQUAL = $__297.EQUAL_EQUAL_EQUAL,
+      IN = $__297.IN,
+      NOT_EQUAL = $__297.NOT_EQUAL,
+      NOT_EQUAL_EQUAL = $__297.NOT_EQUAL_EQUAL,
+      STRING = $__297.STRING,
+      TYPEOF = $__297.TYPEOF;
+  var createParenExpression = System.get("traceur@0.0.32/src/codegeneration/ParseTreeFactory").createParenExpression;
+  var parseExpression = System.get("traceur@0.0.32/src/codegeneration/PlaceholderParser").parseExpression;
+  var ExplodeSymbolExpression = function ExplodeSymbolExpression() {
+    $traceurRuntime.defaultSuperCall(this, $ExplodeSymbolExpression.prototype, arguments);
+  };
+  var $ExplodeSymbolExpression = ExplodeSymbolExpression;
+  ($traceurRuntime.createClass)(ExplodeSymbolExpression, {
+    transformArrowFunctionExpression: function(tree) {
+      return tree;
+    },
+    transformClassExpression: function(tree) {
+      return tree;
+    },
+    transformFunctionBody: function(tree) {
+      return tree;
+    }
+  }, {}, ExplodeExpressionTransformer);
+  function isEqualityExpression(tree) {
+    switch (tree.operator.type) {
+      case EQUAL_EQUAL:
+      case EQUAL_EQUAL_EQUAL:
+      case NOT_EQUAL:
+      case NOT_EQUAL_EQUAL:
+        return true;
+    }
+    return false;
+  }
+  function isTypeof(tree) {
+    return tree.type === UNARY_EXPRESSION && tree.operator.type === TYPEOF;
+  }
+  function isSafeTypeofString(tree) {
+    if (tree.type !== LITERAL_EXPRESSION)
+      return false;
+    var value = tree.literalToken.processedValue;
+    switch (value) {
+      case 'symbol':
+      case 'object':
+        return false;
+    }
+    return true;
+  }
+  var SymbolTransformer = function SymbolTransformer() {
+    $traceurRuntime.defaultSuperCall(this, $SymbolTransformer.prototype, arguments);
+  };
+  var $SymbolTransformer = SymbolTransformer;
+  ($traceurRuntime.createClass)(SymbolTransformer, {
+    transformTypeofOperand_: function(tree) {
+      var operand = this.transformAny(tree.operand);
+      return new UnaryExpression(tree.location, tree.operator, operand);
+    },
+    transformBinaryOperator: function(tree) {
+      if (tree.operator.type === IN) {
+        var name = this.transformAny(tree.left);
+        var object = this.transformAny(tree.right);
+        if (name.type === LITERAL_EXPRESSION)
+          return new BinaryOperator(tree.location, name, tree.operator, object);
+        return parseExpression($__291, name, object);
+      }
+      if (isEqualityExpression(tree)) {
+        if (isTypeof(tree.left) && isSafeTypeofString(tree.right)) {
+          var left = this.transformTypeofOperand_(tree.left);
+          var right = tree.right;
+          return new BinaryOperator(tree.location, left, tree.operator, right);
+        }
+        if (isTypeof(tree.right) && isSafeTypeofString(tree.left)) {
+          var left = tree.left;
+          var right = this.transformTypeofOperand_(tree.right);
+          return new BinaryOperator(tree.location, left, tree.operator, right);
+        }
+      }
+      if (tree.left.type === MEMBER_LOOKUP_EXPRESSION && tree.operator.isAssignmentOperator()) {
+        if (tree.operator.type !== EQUAL) {
+          var exploded = new ExplodeSymbolExpression(this).transformAny(tree);
+          return this.transformAny(createParenExpression(exploded));
+        }
+        var operand = this.transformAny(tree.left.operand);
+        var memberExpression = this.transformAny(tree.left.memberExpression);
+        var value = this.transformAny(tree.right);
+        return parseExpression($__292, operand, memberExpression, value);
+      }
+      return $traceurRuntime.superCall(this, $SymbolTransformer.prototype, "transformBinaryOperator", [tree]);
+    },
+    transformMemberLookupExpression: function(tree) {
+      var operand = this.transformAny(tree.operand);
+      var memberExpression = this.transformAny(tree.memberExpression);
+      if (memberExpression.type === LITERAL_EXPRESSION && memberExpression.literalToken.type !== STRING) {
+        return new MemberLookupExpression(tree.location, operand, memberExpression);
+      }
+      return parseExpression($__293, operand, memberExpression);
+    },
+    transformUnaryExpression: function(tree) {
+      if (tree.operator.type !== TYPEOF)
+        return $traceurRuntime.superCall(this, $SymbolTransformer.prototype, "transformUnaryExpression", [tree]);
+      var operand = this.transformAny(tree.operand);
+      var expression = parseExpression($__294, operand);
+      if (operand.type === IDENTIFIER_EXPRESSION) {
+        return parseExpression($__295, operand, expression);
+      }
+      return expression;
+    }
+  }, {}, TempVarTransformer);
+  return {get SymbolTransformer() {
+      return SymbolTransformer;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/TemplateLiteralTransformer", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/TemplateLiteralTransformer";
+  var $__299 = System.get("traceur@0.0.32/src/syntax/trees/ParseTreeType"),
+      BINARY_OPERATOR = $__299.BINARY_OPERATOR,
+      COMMA_EXPRESSION = $__299.COMMA_EXPRESSION,
+      CONDITIONAL_EXPRESSION = $__299.CONDITIONAL_EXPRESSION,
+      TEMPLATE_LITERAL_PORTION = $__299.TEMPLATE_LITERAL_PORTION;
+  var $__299 = System.get("traceur@0.0.32/src/syntax/trees/ParseTrees"),
+      LiteralExpression = $__299.LiteralExpression,
+      ParenExpression = $__299.ParenExpression;
+  var LiteralToken = System.get("traceur@0.0.32/src/syntax/LiteralToken").LiteralToken;
+  var $__299 = System.get("traceur@0.0.32/src/syntax/PredefinedName"),
+      DEFINE_PROPERTIES = $__299.DEFINE_PROPERTIES,
+      OBJECT = $__299.OBJECT,
+      RAW = $__299.RAW;
+  var ParseTreeTransformer = System.get("traceur@0.0.32/src/codegeneration/ParseTreeTransformer").ParseTreeTransformer;
+  var TempVarTransformer = System.get("traceur@0.0.32/src/codegeneration/TempVarTransformer").TempVarTransformer;
+  var $__299 = System.get("traceur@0.0.32/src/syntax/TokenType"),
+      PERCENT = $__299.PERCENT,
+      PLUS = $__299.PLUS,
+      SLASH = $__299.SLASH,
+      STAR = $__299.STAR,
+      STRING = $__299.STRING;
+  var $__299 = System.get("traceur@0.0.32/src/codegeneration/ParseTreeFactory"),
+      createArgumentList = $__299.createArgumentList,
+      createArrayLiteralExpression = $__299.createArrayLiteralExpression,
+      createBinaryOperator = $__299.createBinaryOperator,
+      createCallExpression = $__299.createCallExpression,
+      createIdentifierExpression = $__299.createIdentifierExpression,
+      createMemberExpression = $__299.createMemberExpression,
+      createObjectFreeze = $__299.createObjectFreeze,
+      createObjectLiteralExpression = $__299.createObjectLiteralExpression,
+      createOperatorToken = $__299.createOperatorToken,
+      createPropertyDescriptor = $__299.createPropertyDescriptor,
+      createPropertyNameAssignment = $__299.createPropertyNameAssignment,
+      createStringLiteral = $__299.createStringLiteral;
+  function createCallSiteIdObject(tree) {
+    var elements = tree.elements;
+    return createObjectFreeze(createCallExpression(createMemberExpression(OBJECT, DEFINE_PROPERTIES), createArgumentList(createCookedStringArray(elements), createObjectLiteralExpression(createPropertyNameAssignment(RAW, createPropertyDescriptor({value: createObjectFreeze(createRawStringArray(elements))}))))));
+  }
+  function maybeAddEmptyStringAtEnd(elements, items) {
+    var length = elements.length;
+    if (!length || elements[length - 1].type !== TEMPLATE_LITERAL_PORTION)
+      items.push(createStringLiteral(''));
+  }
+  function createRawStringArray(elements) {
+    var items = [];
+    for (var i = 0; i < elements.length; i += 2) {
+      var str = replaceRaw(JSON.stringify(elements[i].value.value));
+      var loc = elements[i].location;
+      var expr = new LiteralExpression(loc, new LiteralToken(STRING, str, loc));
+      items.push(expr);
+    }
+    maybeAddEmptyStringAtEnd(elements, items);
+    return createArrayLiteralExpression(items);
+  }
+  function createCookedStringLiteralExpression(tree) {
+    var str = cookString(tree.value.value);
+    var loc = tree.location;
+    return new LiteralExpression(loc, new LiteralToken(STRING, str, loc));
+  }
+  function createCookedStringArray(elements) {
+    var items = [];
+    for (var i = 0; i < elements.length; i += 2) {
+      items.push(createCookedStringLiteralExpression(elements[i]));
+    }
+    maybeAddEmptyStringAtEnd(elements, items);
+    return createArrayLiteralExpression(items);
+  }
+  function replaceRaw(s) {
+    return s.replace(/\u2028|\u2029/g, function(c) {
+      switch (c) {
+        case '\u2028':
+          return '\\u2028';
+        case '\u2029':
+          return '\\u2029';
+        default:
+          throw Error('Not reachable');
+      }
+    });
+  }
+  function cookString(s) {
+    var sb = ['"'];
+    var i = 0,
+        k = 1,
+        c,
+        c2;
+    while (i < s.length) {
+      c = s[i++];
+      switch (c) {
+        case '\\':
+          c2 = s[i++];
+          switch (c2) {
+            case '\n':
+            case '\u2028':
+            case '\u2029':
+              break;
+            case '\r':
+              if (s[i + 1] === '\n') {
+                i++;
+              }
+              break;
+            default:
+              sb[k++] = c;
+              sb[k++] = c2;
+          }
+          break;
+        case '"':
+          sb[k++] = '\\"';
+          break;
+        case '\n':
+          sb[k++] = '\\n';
+          break;
+        case '\r':
+          sb[k++] = '\\r';
+          break;
+        case '\t':
+          sb[k++] = '\\t';
+          break;
+        case '\f':
+          sb[k++] = '\\f';
+          break;
+        case '\b':
+          sb[k++] = '\\b';
+          break;
+        case '\u2028':
+          sb[k++] = '\\u2028';
+          break;
+        case '\u2029':
+          sb[k++] = '\\u2029';
+          break;
+        default:
+          sb[k++] = c;
+      }
+    }
+    sb[k++] = '"';
+    return sb.join('');
+  }
+  var TemplateLiteralTransformer = function TemplateLiteralTransformer() {
+    $traceurRuntime.defaultSuperCall(this, $TemplateLiteralTransformer.prototype, arguments);
+  };
+  var $TemplateLiteralTransformer = TemplateLiteralTransformer;
+  ($traceurRuntime.createClass)(TemplateLiteralTransformer, {
+    transformFunctionBody: function(tree) {
+      return ParseTreeTransformer.prototype.transformFunctionBody.call(this, tree);
+    },
+    transformTemplateLiteralExpression: function(tree) {
+      if (!tree.operand)
+        return this.createDefaultTemplateLiteral(tree);
+      var operand = this.transformAny(tree.operand);
+      var elements = tree.elements;
+      var callsiteIdObject = createCallSiteIdObject(tree);
+      var idName = this.addTempVar(callsiteIdObject);
+      var args = [createIdentifierExpression(idName)];
+      for (var i = 1; i < elements.length; i += 2) {
+        args.push(this.transformAny(elements[i]));
+      }
+      return createCallExpression(operand, createArgumentList(args));
+    },
+    transformTemplateSubstitution: function(tree) {
+      var transformedTree = this.transformAny(tree.expression);
+      switch (transformedTree.type) {
+        case BINARY_OPERATOR:
+          switch (transformedTree.operator.type) {
+            case STAR:
+            case PERCENT:
+            case SLASH:
+              return transformedTree;
+          }
+        case COMMA_EXPRESSION:
+        case CONDITIONAL_EXPRESSION:
+          return new ParenExpression(null, transformedTree);
+      }
+      return transformedTree;
+    },
+    transformTemplateLiteralPortion: function(tree) {
+      return createCookedStringLiteralExpression(tree);
+    },
+    createDefaultTemplateLiteral: function(tree) {
+      var length = tree.elements.length;
+      if (length === 0) {
+        var loc = tree.location;
+        return new LiteralExpression(loc, new LiteralToken(STRING, '""', loc));
+      }
+      var firstNonEmpty = tree.elements[0].value.value === '' ? -1 : 0;
+      var binaryExpression = this.transformAny(tree.elements[0]);
+      if (length == 1)
+        return binaryExpression;
+      var plusToken = createOperatorToken(PLUS);
+      for (var i = 1; i < length; i++) {
+        var element = tree.elements[i];
+        if (element.type === TEMPLATE_LITERAL_PORTION) {
+          if (element.value.value === '')
+            continue;
+          else if (firstNonEmpty < 0 && i === 2)
+            binaryExpression = binaryExpression.right;
+        }
+        var transformedTree = this.transformAny(tree.elements[i]);
+        binaryExpression = createBinaryOperator(binaryExpression, plusToken, transformedTree);
+      }
+      return new ParenExpression(null, binaryExpression);
+    }
+  }, {}, TempVarTransformer);
+  return {get TemplateLiteralTransformer() {
+      return TemplateLiteralTransformer;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/TypeAssertionTransformer", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/TypeAssertionTransformer";
+  var $__300 = Object.freeze(Object.defineProperties(["assert.type(", ", ", ")"], {raw: {value: Object.freeze(["assert.type(", ", ", ")"])}})),
+      $__301 = Object.freeze(Object.defineProperties(["assert.argumentTypes(", ")"], {raw: {value: Object.freeze(["assert.argumentTypes(", ")"])}})),
+      $__302 = Object.freeze(Object.defineProperties(["return assert.returnType((", "), ", ")"], {raw: {value: Object.freeze(["return assert.returnType((", "), ", ")"])}})),
+      $__303 = Object.freeze(Object.defineProperties(["$traceurRuntime.type.any"], {raw: {value: Object.freeze(["$traceurRuntime.type.any"])}}));
+  var $__305 = System.get("traceur@0.0.32/src/syntax/trees/ParseTreeType"),
+      BINDING_ELEMENT = $__305.BINDING_ELEMENT,
+      REST_PARAMETER = $__305.REST_PARAMETER;
+  var $__305 = System.get("traceur@0.0.32/src/syntax/trees/ParseTrees"),
+      ImportDeclaration = $__305.ImportDeclaration,
+      ImportSpecifier = $__305.ImportSpecifier,
+      ImportSpecifierSet = $__305.ImportSpecifierSet,
+      Module = $__305.Module,
+      ModuleSpecifier = $__305.ModuleSpecifier,
+      ReturnStatement = $__305.ReturnStatement,
+      Script = $__305.Script,
+      VariableDeclaration = $__305.VariableDeclaration;
+  var $__305 = System.get("traceur@0.0.32/src/codegeneration/ParseTreeFactory"),
+      createArgumentList = $__305.createArgumentList,
+      createExpressionStatement = $__305.createExpressionStatement,
+      createIdentifierExpression = $__305.createIdentifierExpression,
+      createIdentifierToken = $__305.createIdentifierToken,
+      createStringLiteralToken = $__305.createStringLiteralToken;
+  var $__305 = System.get("traceur@0.0.32/src/codegeneration/PlaceholderParser"),
+      parseExpression = $__305.parseExpression,
+      parseStatement = $__305.parseStatement;
+  var ParameterTransformer = System.get("traceur@0.0.32/src/codegeneration/ParameterTransformer").ParameterTransformer;
+  var options = System.get("traceur@0.0.32/src/options").options;
+  var TypeAssertionTransformer = function TypeAssertionTransformer(identifierGenerator) {
+    $traceurRuntime.superCall(this, $TypeAssertionTransformer.prototype, "constructor", [identifierGenerator]);
+    this.returnTypeStack_ = [];
+    this.parametersStack_ = [];
+    this.assertionAdded_ = false;
+  };
+  var $TypeAssertionTransformer = TypeAssertionTransformer;
+  ($traceurRuntime.createClass)(TypeAssertionTransformer, {
+    transformScript: function(tree) {
+      return this.prependAssertionImport_($traceurRuntime.superCall(this, $TypeAssertionTransformer.prototype, "transformScript", [tree]), Script);
+    },
+    transformModule: function(tree) {
+      return this.prependAssertionImport_($traceurRuntime.superCall(this, $TypeAssertionTransformer.prototype, "transformModule", [tree]), Module);
+    },
+    transformVariableDeclaration: function(tree) {
+      if (tree.typeAnnotation && tree.initialiser) {
+        var assert = parseExpression($__300, tree.initialiser, tree.typeAnnotation);
+        tree = new VariableDeclaration(tree.location, tree.lvalue, tree.typeAnnotation, assert);
+        this.assertionAdded_ = true;
+      }
+      return $traceurRuntime.superCall(this, $TypeAssertionTransformer.prototype, "transformVariableDeclaration", [tree]);
+    },
+    transformFormalParameterList: function(tree) {
+      this.parametersStack_.push({
+        atLeastOneParameterTyped: false,
+        arguments: []
+      });
+      var transformed = $traceurRuntime.superCall(this, $TypeAssertionTransformer.prototype, "transformFormalParameterList", [tree]);
+      var params = this.parametersStack_.pop();
+      if (params.atLeastOneParameterTyped) {
+        var argumentList = createArgumentList(params.arguments);
+        var assertStatement = parseStatement($__301, argumentList);
+        this.parameterStatements.push(assertStatement);
+        this.assertionAdded_ = true;
+      }
+      return transformed;
+    },
+    transformFormalParameter: function(tree) {
+      var transformed = $traceurRuntime.superCall(this, $TypeAssertionTransformer.prototype, "transformFormalParameter", [tree]);
+      switch (transformed.parameter.type) {
+        case BINDING_ELEMENT:
+          this.transformBindingElementParameter_(transformed.parameter, transformed.typeAnnotation);
+          break;
+        case REST_PARAMETER:
+          break;
+      }
+      return transformed;
+    },
+    transformGetAccessor: function(tree) {
+      this.pushReturnType_(tree.typeAnnotation);
+      tree = $traceurRuntime.superCall(this, $TypeAssertionTransformer.prototype, "transformGetAccessor", [tree]);
+      this.popReturnType_();
+      return tree;
+    },
+    transformPropertyMethodAssignment: function(tree) {
+      this.pushReturnType_(tree.typeAnnotation);
+      tree = $traceurRuntime.superCall(this, $TypeAssertionTransformer.prototype, "transformPropertyMethodAssignment", [tree]);
+      this.popReturnType_();
+      return tree;
+    },
+    transformFunctionDeclaration: function(tree) {
+      this.pushReturnType_(tree.typeAnnotation);
+      tree = $traceurRuntime.superCall(this, $TypeAssertionTransformer.prototype, "transformFunctionDeclaration", [tree]);
+      this.popReturnType_();
+      return tree;
+    },
+    transformFunctionExpression: function(tree) {
+      this.pushReturnType_(tree.typeAnnotation);
+      tree = $traceurRuntime.superCall(this, $TypeAssertionTransformer.prototype, "transformFunctionExpression", [tree]);
+      this.popReturnType_();
+      return tree;
+    },
+    transformReturnStatement: function(tree) {
+      tree = $traceurRuntime.superCall(this, $TypeAssertionTransformer.prototype, "transformReturnStatement", [tree]);
+      if (this.returnType_ && tree.expression) {
+        this.assertionAdded_ = true;
+        return parseStatement($__302, tree.expression, this.returnType_);
+      }
+      return tree;
+    },
+    transformBindingElementParameter_: function(element, typeAnnotation) {
+      if (!element.binding.isPattern()) {
+        if (typeAnnotation) {
+          this.paramTypes_.atLeastOneParameterTyped = true;
+        } else {
+          typeAnnotation = parseExpression($__303);
+        }
+        this.paramTypes_.arguments.push(createIdentifierExpression(element.binding.identifierToken), typeAnnotation);
+        return;
+      }
+    },
+    pushReturnType_: function(typeAnnotation) {
+      this.returnTypeStack_.push(this.transformAny(typeAnnotation));
+    },
+    prependAssertionImport_: function(tree, Ctor) {
+      if (!this.assertionAdded_ || options.typeAssertionModule === null)
+        return tree;
+      var importStatement = new ImportDeclaration(null, new ImportSpecifierSet(null, [new ImportSpecifier(null, createIdentifierToken('assert'), null)]), new ModuleSpecifier(null, createStringLiteralToken(options.typeAssertionModule)));
+      tree = new Ctor(tree.location, $traceurRuntime.spread([importStatement], tree.scriptItemList), tree.moduleName);
+      return tree;
+    },
+    popReturnType_: function() {
+      return this.returnTypeStack_.pop();
+    },
+    get returnType_() {
+      return this.returnTypeStack_.length > 0 ? this.returnTypeStack_[this.returnTypeStack_.length - 1] : null;
+    },
+    get paramTypes_() {
+      return this.parametersStack_[this.parametersStack_.length - 1];
+    }
+  }, {}, ParameterTransformer);
+  return {get TypeAssertionTransformer() {
+      return TypeAssertionTransformer;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/TypeToExpressionTransformer", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/TypeToExpressionTransformer";
+  var ParseTreeTransformer = System.get("traceur@0.0.32/src/codegeneration/ParseTreeTransformer").ParseTreeTransformer;
+  var $__307 = System.get("traceur@0.0.32/src/codegeneration/ParseTreeFactory"),
+      createIdentifierExpression = $__307.createIdentifierExpression,
+      createMemberExpression = $__307.createMemberExpression;
+  var TypeToExpressionTransformer = function TypeToExpressionTransformer() {
+    $traceurRuntime.defaultSuperCall(this, $TypeToExpressionTransformer.prototype, arguments);
+  };
+  var $TypeToExpressionTransformer = TypeToExpressionTransformer;
+  ($traceurRuntime.createClass)(TypeToExpressionTransformer, {
+    transformTypeName: function(tree) {
+      return createIdentifierExpression(tree.name);
+    },
+    transformPredefinedType: function(tree) {
+      return createMemberExpression('$traceurRuntime', 'type', tree.typeToken);
+    }
+  }, {}, ParseTreeTransformer);
+  return {get TypeToExpressionTransformer() {
+      return TypeToExpressionTransformer;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/TypeTransformer", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/TypeTransformer";
+  var $__309 = System.get("traceur@0.0.32/src/syntax/trees/ParseTrees"),
+      FormalParameter = $__309.FormalParameter,
+      FunctionDeclaration = $__309.FunctionDeclaration,
+      FunctionExpression = $__309.FunctionExpression,
+      GetAccessor = $__309.GetAccessor,
+      PropertyMethodAssignment = $__309.PropertyMethodAssignment,
+      VariableDeclaration = $__309.VariableDeclaration;
+  var ParseTreeTransformer = System.get("traceur@0.0.32/src/codegeneration/ParseTreeTransformer").ParseTreeTransformer;
+  var TypeTransformer = function TypeTransformer() {
+    $traceurRuntime.defaultSuperCall(this, $TypeTransformer.prototype, arguments);
+  };
+  var $TypeTransformer = TypeTransformer;
+  ($traceurRuntime.createClass)(TypeTransformer, {
+    transformVariableDeclaration: function(tree) {
+      if (tree.typeAnnotation) {
+        tree = new VariableDeclaration(tree.location, tree.lvalue, null, tree.initialiser);
+      }
+      return $traceurRuntime.superCall(this, $TypeTransformer.prototype, "transformVariableDeclaration", [tree]);
+    },
+    transformFormalParameter: function(tree) {
+      if (tree.typeAnnotation !== null)
+        return new FormalParameter(tree.location, tree.parameter, null, []);
+      return tree;
+    },
+    transformFunctionDeclaration: function(tree) {
+      if (tree.typeAnnotation) {
+        tree = new FunctionDeclaration(tree.location, tree.name, tree.isGenerator, tree.formalParameterList, null, tree.annotations, tree.functionBody);
+      }
+      return $traceurRuntime.superCall(this, $TypeTransformer.prototype, "transformFunctionDeclaration", [tree]);
+    },
+    transformFunctionExpression: function(tree) {
+      if (tree.typeAnnotation) {
+        tree = new FunctionExpression(tree.location, tree.name, tree.isGenerator, tree.formalParameterList, null, tree.annotations, tree.functionBody);
+      }
+      return $traceurRuntime.superCall(this, $TypeTransformer.prototype, "transformFunctionExpression", [tree]);
+    },
+    transformPropertyMethodAssignment: function(tree) {
+      if (tree.typeAnnotation) {
+        tree = new PropertyMethodAssignment(tree.location, tree.isStatic, tree.isGenerator, tree.name, tree.formalParameterList, null, tree.annotations, tree.functionBody);
+      }
+      return $traceurRuntime.superCall(this, $TypeTransformer.prototype, "transformPropertyMethodAssignment", [tree]);
+    },
+    transformGetAccessor: function(tree) {
+      if (tree.typeAnnotation) {
+        tree = new GetAccessor(tree.location, tree.isStatic, tree.name, null, tree.annotations, tree.body);
+      }
+      return $traceurRuntime.superCall(this, $TypeTransformer.prototype, "transformGetAccessor", [tree]);
+    }
+  }, {}, ParseTreeTransformer);
+  return {get TypeTransformer() {
+      return TypeTransformer;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/UniqueIdentifierGenerator", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/UniqueIdentifierGenerator";
+  var UniqueIdentifierGenerator = function UniqueIdentifierGenerator() {
+    this.identifierIndex = 0;
+  };
+  ($traceurRuntime.createClass)(UniqueIdentifierGenerator, {generateUniqueIdentifier: function() {
+      return ("$__" + this.identifierIndex++);
+    }}, {});
+  return {get UniqueIdentifierGenerator() {
+      return UniqueIdentifierGenerator;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/FromOptionsTransformer", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/FromOptionsTransformer";
+  var AmdTransformer = System.get("traceur@0.0.32/src/codegeneration/AmdTransformer").AmdTransformer;
+  var AnnotationsTransformer = System.get("traceur@0.0.32/src/codegeneration/AnnotationsTransformer").AnnotationsTransformer;
+  var ArrayComprehensionTransformer = System.get("traceur@0.0.32/src/codegeneration/ArrayComprehensionTransformer").ArrayComprehensionTransformer;
+  var ArrowFunctionTransformer = System.get("traceur@0.0.32/src/codegeneration/ArrowFunctionTransformer").ArrowFunctionTransformer;
+  var BlockBindingTransformer = System.get("traceur@0.0.32/src/codegeneration/BlockBindingTransformer").BlockBindingTransformer;
+  var ClassTransformer = System.get("traceur@0.0.32/src/codegeneration/ClassTransformer").ClassTransformer;
+  var CommonJsModuleTransformer = System.get("traceur@0.0.32/src/codegeneration/CommonJsModuleTransformer").CommonJsModuleTransformer;
+  var DefaultParametersTransformer = System.get("traceur@0.0.32/src/codegeneration/DefaultParametersTransformer").DefaultParametersTransformer;
+  var DestructuringTransformer = System.get("traceur@0.0.32/src/codegeneration/DestructuringTransformer").DestructuringTransformer;
+  var ForOfTransformer = System.get("traceur@0.0.32/src/codegeneration/ForOfTransformer").ForOfTransformer;
+  var FreeVariableChecker = System.get("traceur@0.0.32/src/semantics/FreeVariableChecker").FreeVariableChecker;
+  var GeneratorComprehensionTransformer = System.get("traceur@0.0.32/src/codegeneration/GeneratorComprehensionTransformer").GeneratorComprehensionTransformer;
+  var GeneratorTransformPass = System.get("traceur@0.0.32/src/codegeneration/GeneratorTransformPass").GeneratorTransformPass;
+  var InlineModuleTransformer = System.get("traceur@0.0.32/src/codegeneration/InlineModuleTransformer").InlineModuleTransformer;
+  var ModuleTransformer = System.get("traceur@0.0.32/src/codegeneration/ModuleTransformer").ModuleTransformer;
+  var MultiTransformer = System.get("traceur@0.0.32/src/codegeneration/MultiTransformer").MultiTransformer;
+  var NumericLiteralTransformer = System.get("traceur@0.0.32/src/codegeneration/NumericLiteralTransformer").NumericLiteralTransformer;
+  var ObjectLiteralTransformer = System.get("traceur@0.0.32/src/codegeneration/ObjectLiteralTransformer").ObjectLiteralTransformer;
+  var ObjectMap = System.get("traceur@0.0.32/src/util/ObjectMap").ObjectMap;
+  var ParseTreeValidator = System.get("traceur@0.0.32/src/syntax/ParseTreeValidator").ParseTreeValidator;
+  var PropertyNameShorthandTransformer = System.get("traceur@0.0.32/src/codegeneration/PropertyNameShorthandTransformer").PropertyNameShorthandTransformer;
+  var InstantiateModuleTransformer = System.get("traceur@0.0.32/src/codegeneration/InstantiateModuleTransformer").InstantiateModuleTransformer;
+  var RestParameterTransformer = System.get("traceur@0.0.32/src/codegeneration/RestParameterTransformer").RestParameterTransformer;
+  var SpreadTransformer = System.get("traceur@0.0.32/src/codegeneration/SpreadTransformer").SpreadTransformer;
+  var SymbolTransformer = System.get("traceur@0.0.32/src/codegeneration/SymbolTransformer").SymbolTransformer;
+  var TemplateLiteralTransformer = System.get("traceur@0.0.32/src/codegeneration/TemplateLiteralTransformer").TemplateLiteralTransformer;
+  var TypeTransformer = System.get("traceur@0.0.32/src/codegeneration/TypeTransformer").TypeTransformer;
+  var TypeAssertionTransformer = System.get("traceur@0.0.32/src/codegeneration/TypeAssertionTransformer").TypeAssertionTransformer;
+  var TypeToExpressionTransformer = System.get("traceur@0.0.32/src/codegeneration/TypeToExpressionTransformer").TypeToExpressionTransformer;
+  var UniqueIdentifierGenerator = System.get("traceur@0.0.32/src/codegeneration/UniqueIdentifierGenerator").UniqueIdentifierGenerator;
+  var $__313 = System.get("traceur@0.0.32/src/options"),
+      options = $__313.options,
+      transformOptions = $__313.transformOptions;
+  var FromOptionsTransformer = function FromOptionsTransformer(reporter) {
+    var idGenerator = arguments[1] !== (void 0) ? arguments[1] : new UniqueIdentifierGenerator();
+    var $__311 = this;
+    $traceurRuntime.superCall(this, $FromOptionsTransformer.prototype, "constructor", [reporter, options.validate]);
+    var append = (function(transformer) {
+      $__311.append((function(tree) {
+        return new transformer(idGenerator, reporter).transformAny(tree);
+      }));
+    });
+    if (transformOptions.numericLiterals)
+      append(NumericLiteralTransformer);
+    if (transformOptions.templateLiterals)
+      append(TemplateLiteralTransformer);
+    if (options.types) {
+      append(TypeToExpressionTransformer);
+    }
+    if (transformOptions.annotations)
+      append(AnnotationsTransformer);
+    if (options.typeAssertions)
+      append(TypeAssertionTransformer);
+    if (transformOptions.modules) {
+      switch (transformOptions.modules) {
+        case 'commonjs':
+          append(CommonJsModuleTransformer);
+          break;
+        case 'amd':
+          append(AmdTransformer);
+          break;
+        case 'inline':
+          append(InlineModuleTransformer);
+          break;
+        case 'instantiate':
+          append(InstantiateModuleTransformer);
+          break;
+        default:
+          append(ModuleTransformer);
+      }
+    }
+    if (transformOptions.arrowFunctions)
+      append(ArrowFunctionTransformer);
+    if (transformOptions.classes)
+      append(ClassTransformer);
+    if (transformOptions.propertyNameShorthand)
+      append(PropertyNameShorthandTransformer);
+    if (transformOptions.propertyMethods || transformOptions.computedPropertyNames) {
+      append(ObjectLiteralTransformer);
+    }
+    if (transformOptions.generatorComprehension)
+      append(GeneratorComprehensionTransformer);
+    if (transformOptions.arrayComprehension)
+      append(ArrayComprehensionTransformer);
+    if (transformOptions.forOf)
+      append(ForOfTransformer);
+    if (transformOptions.restParameters)
+      append(RestParameterTransformer);
+    if (transformOptions.defaultParameters)
+      append(DefaultParametersTransformer);
+    if (transformOptions.destructuring)
+      append(DestructuringTransformer);
+    if (transformOptions.types)
+      append(TypeTransformer);
+    if (transformOptions.spread)
+      append(SpreadTransformer);
+    if (transformOptions.blockBinding)
+      append(BlockBindingTransformer);
+    if (transformOptions.generators || transformOptions.deferredFunctions)
+      append(GeneratorTransformPass);
+    if (transformOptions.symbols)
+      append(SymbolTransformer);
+    if (options.freeVariableChecker) {
+      this.append((function(tree) {
+        FreeVariableChecker.checkScript(reporter, tree);
+        return tree;
+      }));
+    }
+  };
+  var $FromOptionsTransformer = FromOptionsTransformer;
+  ($traceurRuntime.createClass)(FromOptionsTransformer, {}, {}, MultiTransformer);
+  return {get FromOptionsTransformer() {
+      return FromOptionsTransformer;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/module/AttachModuleNameTransformer", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/module/AttachModuleNameTransformer";
+  var ParseTreeTransformer = System.get("traceur@0.0.32/src/codegeneration/ParseTreeTransformer").ParseTreeTransformer;
+  var $__315 = System.get("traceur@0.0.32/src/syntax/trees/ParseTrees"),
+      Module = $__315.Module,
+      Script = $__315.Script;
+  var AttachModuleNameTransformer = function AttachModuleNameTransformer(moduleName) {
+    this.moduleName_ = moduleName;
+  };
+  ($traceurRuntime.createClass)(AttachModuleNameTransformer, {
+    transformModule: function(tree) {
+      return new Module(tree.location, tree.scriptItemList, this.moduleName_);
+    },
+    transformScript: function(tree) {
+      return new Script(tree.location, tree.scriptItemList, this.moduleName_);
+    }
+  }, {}, ParseTreeTransformer);
+  return {get AttachModuleNameTransformer() {
+      return AttachModuleNameTransformer;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/module/ValidationVisitor", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/module/ValidationVisitor";
+  var ModuleVisitor = System.get("traceur@0.0.32/src/codegeneration/module/ModuleVisitor").ModuleVisitor;
+  var ValidationVisitor = function ValidationVisitor() {
+    $traceurRuntime.defaultSuperCall(this, $ValidationVisitor.prototype, arguments);
+  };
+  var $ValidationVisitor = ValidationVisitor;
+  ($traceurRuntime.createClass)(ValidationVisitor, {
+    checkExport_: function(tree, name) {
+      var description = this.validatingModuleDescription_;
+      if (description && !description.getExport(name)) {
+        var moduleName = description.normalizedName;
+        this.reportError(tree, ("'" + name + "' is not exported by '" + moduleName + "'"));
+      }
+    },
+    checkImport_: function(tree, name) {
+      var existingImport = this.moduleSymbol.getImport(name);
+      if (existingImport) {
+        this.reportError(tree, ("'" + name + "' was previously imported at " + existingImport.location.start));
+      } else {
+        this.moduleSymbol.addImport(name, tree);
+      }
+    },
+    visitAndValidate_: function(moduleDescription, tree) {
+      var validatingModuleDescription = this.validatingModuleDescription_;
+      this.validatingModuleDescription_ = moduleDescription;
+      this.visitAny(tree);
+      this.validatingModuleDescription_ = validatingModuleDescription;
+    },
+    visitNamedExport: function(tree) {
+      if (tree.moduleSpecifier) {
+        var name = tree.moduleSpecifier.token.processedValue;
+        var moduleDescription = this.getModuleDescriptionForModuleSpecifier(name);
+        this.visitAndValidate_(moduleDescription, tree.specifierSet);
+      }
+    },
+    visitExportSpecifier: function(tree) {
+      this.checkExport_(tree, tree.lhs.value);
+    },
+    visitImportDeclaration: function(tree) {
+      var name = tree.moduleSpecifier.token.processedValue;
+      var moduleDescription = this.getModuleDescriptionForModuleSpecifier(name);
+      this.visitAndValidate_(moduleDescription, tree.importClause);
+    },
+    visitImportSpecifier: function(tree) {
+      var importName = tree.rhs ? tree.rhs.value : tree.lhs.value;
+      this.checkImport_(tree, importName);
+      this.checkExport_(tree, tree.lhs.value);
+    },
+    visitImportedBinding: function(tree) {
+      var importName = tree.binding.identifierToken.value;
+      this.checkImport_(tree, importName);
+      this.checkExport_(tree, 'default');
+    }
+  }, {}, ModuleVisitor);
+  return {get ValidationVisitor() {
+      return ValidationVisitor;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/module/ExportListBuilder", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/module/ExportListBuilder";
+  var ExportVisitor = System.get("traceur@0.0.32/src/codegeneration/module/ExportVisitor").ExportVisitor;
+  var ValidationVisitor = System.get("traceur@0.0.32/src/codegeneration/module/ValidationVisitor").ValidationVisitor;
+  var transformOptions = System.get("traceur@0.0.32/src/options").transformOptions;
+  var ExportListBuilder = function ExportListBuilder(reporter) {
+    this.reporter_ = reporter;
+  };
+  ($traceurRuntime.createClass)(ExportListBuilder, {buildExportList: function(deps, loader) {
+      if (!transformOptions.modules)
+        return;
+      var reporter = this.reporter_;
+      function doVisit(ctor) {
+        for (var i = 0; i < deps.length; i++) {
+          var visitor = new ctor(reporter, loader, deps[i].moduleSymbol);
+          visitor.visitAny(deps[i].tree);
+        }
+      }
+      function reverseVisit(ctor) {
+        for (var i = deps.length - 1; i >= 0; i--) {
+          var visitor = new ctor(reporter, loader, deps[i].moduleSymbol);
+          visitor.visitAny(deps[i].tree);
+        }
+      }
+      reverseVisit(ExportVisitor);
+      doVisit(ValidationVisitor);
+    }}, {});
+  return {get ExportListBuilder() {
+      return ExportListBuilder;
+    }};
+});
+System.register("traceur@0.0.32/src/util/url", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/util/url";
+  var canonicalizeUrl = $traceurRuntime.canonicalizeUrl;
+  var isAbsolute = $traceurRuntime.isAbsolute;
+  var removeDotSegments = $traceurRuntime.removeDotSegments;
+  var resolveUrl = $traceurRuntime.resolveUrl;
+  return {
+    get canonicalizeUrl() {
+      return canonicalizeUrl;
+    },
+    get isAbsolute() {
+      return isAbsolute;
+    },
+    get removeDotSegments() {
+      return removeDotSegments;
+    },
+    get resolveUrl() {
+      return resolveUrl;
+    }
+  };
+});
+System.register("traceur@0.0.32/src/codegeneration/module/ModuleSpecifierVisitor", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/module/ModuleSpecifierVisitor";
+  var ParseTreeVisitor = System.get("traceur@0.0.32/src/syntax/ParseTreeVisitor").ParseTreeVisitor;
+  var STRING = System.get("traceur@0.0.32/src/syntax/TokenType").STRING;
+  var LiteralToken = System.get("traceur@0.0.32/src/syntax/LiteralToken").LiteralToken;
+  var canonicalizeUrl = System.get("traceur@0.0.32/src/util/url").canonicalizeUrl;
+  var options = System.get("traceur@0.0.32/src/options").options;
+  var ModuleSpecifierVisitor = function ModuleSpecifierVisitor(reporter) {
+    $traceurRuntime.superCall(this, $ModuleSpecifierVisitor.prototype, "constructor", []);
+    this.moduleSpecifiers_ = Object.create(null);
+  };
+  var $ModuleSpecifierVisitor = ModuleSpecifierVisitor;
+  ($traceurRuntime.createClass)(ModuleSpecifierVisitor, {
+    get moduleSpecifiers() {
+      return Object.keys(this.moduleSpecifiers_);
+    },
+    visitModuleSpecifier: function(tree) {
+      this.moduleSpecifiers_[tree.token.processedValue] = true;
+    },
+    visitVariableDeclaration: function(tree) {
+      this.addTypeAssertionDependency_(tree.typeAnnotation);
+      return $traceurRuntime.superCall(this, $ModuleSpecifierVisitor.prototype, "visitVariableDeclaration", [tree]);
+    },
+    visitFormalParameter: function(tree) {
+      this.addTypeAssertionDependency_(tree.typeAnnotation);
+      return $traceurRuntime.superCall(this, $ModuleSpecifierVisitor.prototype, "visitFormalParameter", [tree]);
+    },
+    visitGetAccessor: function(tree) {
+      this.addTypeAssertionDependency_(tree.typeAnnotation);
+      return $traceurRuntime.superCall(this, $ModuleSpecifierVisitor.prototype, "visitGetAccessor", [tree]);
+    },
+    visitPropertyMethodAssignment: function(tree) {
+      this.addTypeAssertionDependency_(tree.typeAnnotation);
+      return $traceurRuntime.superCall(this, $ModuleSpecifierVisitor.prototype, "visitPropertyMethodAssignment", [tree]);
+    },
+    visitFunctionDeclaration: function(tree) {
+      this.addTypeAssertionDependency_(tree.typeAnnotation);
+      return $traceurRuntime.superCall(this, $ModuleSpecifierVisitor.prototype, "visitFunctionDeclaration", [tree]);
+    },
+    visitFunctionExpression: function(tree) {
+      this.addTypeAssertionDependency_(tree.typeAnnotation);
+      return $traceurRuntime.superCall(this, $ModuleSpecifierVisitor.prototype, "visitFunctionExpression", [tree]);
+    },
+    addTypeAssertionDependency_: function(typeAnnotation) {
+      if (typeAnnotation !== null && options.typeAssertionModule !== null)
+        this.moduleSpecifiers_[options.typeAssertionModule] = true;
+    }
+  }, {}, ParseTreeVisitor);
+  return {get ModuleSpecifierVisitor() {
+      return ModuleSpecifierVisitor;
+    }};
+});
+System.register("traceur@0.0.32/src/runtime/system-map", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/runtime/system-map";
+  function prefixMatchLength(name, prefix) {
+    var prefixParts = prefix.split('/');
+    var nameParts = name.split('/');
+    if (prefixParts.length > nameParts.length)
+      return 0;
+    for (var i = 0; i < prefixParts.length; i++) {
+      if (nameParts[i] != prefixParts[i])
+        return 0;
+    }
+    return prefixParts.length;
+  }
+  function applyMap(map, name, parentName) {
+    var curMatch,
+        curMatchLength = 0;
+    var curParent,
+        curParentMatchLength = 0;
+    if (parentName) {
+      var mappedName;
+      Object.getOwnPropertyNames(map).some(function(p) {
+        var curMap = map[p];
+        if (curMap && typeof curMap === 'object') {
+          if (prefixMatchLength(parentName, p) <= curParentMatchLength)
+            return;
+          Object.getOwnPropertyNames(curMap).forEach(function(q) {
+            if (prefixMatchLength(name, q) > curMatchLength) {
+              curMatch = q;
+              curMatchLength = q.split('/').length;
+              curParent = p;
+              curParentMatchLength = p.split('/').length;
+            }
+          });
+        }
+        if (curMatch) {
+          var subPath = name.split('/').splice(curMatchLength).join('/');
+          mappedName = map[curParent][curMatch] + (subPath ? '/' + subPath : '');
+          return mappedName;
+        }
+      });
+    }
+    if (mappedName)
+      return mappedName;
+    Object.getOwnPropertyNames(map).forEach(function(p) {
+      var curMap = map[p];
+      if (curMap && typeof curMap === 'string') {
+        if (prefixMatchLength(name, p) > curMatchLength) {
+          curMatch = p;
+          curMatchLength = p.split('/').length;
+        }
+      }
+    });
+    if (!curMatch)
+      return name;
+    var subPath = name.split('/').splice(curMatchLength).join('/');
+    return map[curMatch] + (subPath ? '/' + subPath : '');
+  }
+  var systemjs = {applyMap: applyMap};
+  return {get systemjs() {
+      return systemjs;
+    }};
+});
+System.register("traceur@0.0.32/src/runtime/webLoader", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/runtime/webLoader";
+  var webLoader = {load: function(url, callback, errback) {
+      var xhr = new XMLHttpRequest();
+      xhr.onload = (function() {
+        if (xhr.status == 200 || xhr.status == 0) {
+          callback(xhr.responseText);
+        } else {
+          errback();
+        }
+        xhr = null;
+      });
+      xhr.onerror = (function(err) {
+        errback(err);
+      });
+      xhr.open('GET', url, true);
+      xhr.send();
+      return (function() {
+        xhr && xhr.abort();
+      });
+    }};
+  return {get webLoader() {
+      return webLoader;
+    }};
+});
+System.register("traceur@0.0.32/src/runtime/LoaderHooks", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/runtime/LoaderHooks";
+  var AttachModuleNameTransformer = System.get("traceur@0.0.32/src/codegeneration/module/AttachModuleNameTransformer").AttachModuleNameTransformer;
+  var FromOptionsTransformer = System.get("traceur@0.0.32/src/codegeneration/FromOptionsTransformer").FromOptionsTransformer;
+  var ExportListBuilder = System.get("traceur@0.0.32/src/codegeneration/module/ExportListBuilder").ExportListBuilder;
+  var ModuleSpecifierVisitor = System.get("traceur@0.0.32/src/codegeneration/module/ModuleSpecifierVisitor").ModuleSpecifierVisitor;
+  var ModuleSymbol = System.get("traceur@0.0.32/src/codegeneration/module/ModuleSymbol").ModuleSymbol;
+  var Parser = System.get("traceur@0.0.32/src/syntax/Parser").Parser;
+  var options = System.get("traceur@0.0.32/src/options").options;
+  var SourceFile = System.get("traceur@0.0.32/src/syntax/SourceFile").SourceFile;
+  var systemjs = System.get("traceur@0.0.32/src/runtime/system-map").systemjs;
+  var UniqueIdentifierGenerator = System.get("traceur@0.0.32/src/codegeneration/UniqueIdentifierGenerator").UniqueIdentifierGenerator;
+  var $__324 = System.get("traceur@0.0.32/src/util/url"),
+      isAbsolute = $__324.isAbsolute,
+      resolveUrl = $__324.resolveUrl;
+  var webLoader = System.get("traceur@0.0.32/src/runtime/webLoader").webLoader;
+  var assert = System.get("traceur@0.0.32/src/util/assert").assert;
+  var NOT_STARTED = 0;
+  var LOADING = 1;
+  var LOADED = 2;
+  var PARSED = 3;
+  var TRANSFORMING = 4;
+  var TRANSFORMED = 5;
+  var COMPLETE = 6;
+  var ERROR = 7;
+  var identifierGenerator = new UniqueIdentifierGenerator();
+  var LoaderHooks = function LoaderHooks(reporter, baseURL) {
+    var fileLoader = arguments[2] !== (void 0) ? arguments[2] : webLoader;
+    var moduleStore = arguments[3] !== (void 0) ? arguments[3] : $traceurRuntime.ModuleStore;
+    this.reporter = reporter;
+    this.baseURL_ = baseURL;
+    this.moduleStore_ = moduleStore;
+    this.fileLoader = fileLoader;
+    this.exportListBuilder_ = new ExportListBuilder(this.reporter);
+  };
+  ($traceurRuntime.createClass)(LoaderHooks, {
+    get: function(normalizedName) {
+      return this.moduleStore_.get(normalizedName);
+    },
+    set: function(normalizedName, module) {
+      this.moduleStore_.set(normalizedName, module);
+    },
+    normalize: function(name, referrerName, referrerAddress) {
+      var normalizedName = this.moduleStore_.normalize(name, referrerName, referrerAddress);
+      if (System.map)
+        return systemjs.applyMap(System.map, normalizedName, referrerName);
+      else
+        return normalizedName;
+    },
+    get baseURL() {
+      return this.baseURL_;
+    },
+    set baseURL(value) {
+      this.baseURL_ = String(value);
+    },
+    getModuleSpecifiers: function(codeUnit) {
+      if (!this.parse(codeUnit))
+        return;
+      codeUnit.state = PARSED;
+      var moduleSpecifierVisitor = new ModuleSpecifierVisitor(this.reporter);
+      moduleSpecifierVisitor.visit(codeUnit.metadata.tree);
+      return moduleSpecifierVisitor.moduleSpecifiers;
+    },
+    parse: function(codeUnit) {
+      assert(!codeUnit.metadata.tree);
+      var reporter = this.reporter;
+      var normalizedName = codeUnit.normalizedName;
+      var program = codeUnit.source;
+      var url = codeUnit.url || normalizedName;
+      var file = new SourceFile(url, program);
+      var parser = new Parser(file, reporter);
+      if (codeUnit.type == 'module')
+        codeUnit.metadata.tree = parser.parseModule();
+      else
+        codeUnit.metadata.tree = parser.parseScript();
+      codeUnit.metadata.moduleSymbol = new ModuleSymbol(codeUnit.metadata.tree, normalizedName);
+      return !reporter.hadError();
+    },
+    transform: function(codeUnit) {
+      var transformer = new AttachModuleNameTransformer(codeUnit.normalizedName);
+      var transformedTree = transformer.transformAny(codeUnit.metadata.tree);
+      transformer = new FromOptionsTransformer(this.reporter, identifierGenerator);
+      return transformer.transform(transformedTree);
+    },
+    fetch: function(load) {
+      var $__322 = this;
+      return new Promise((function(resolve, reject) {
+        $__322.fileLoader.load(load.address, resolve, reject);
+      }));
+    },
+    translate: function(load) {
+      return new Promise((function(resolve, reject) {
+        resolve(load.source);
+      }));
+    },
+    instantiate: function($__324) {
+      var name = $__324.name,
+          metadata = $__324.metadata,
+          address = $__324.address,
+          source = $__324.source,
+          sourceMap = $__324.sourceMap;
+      return new Promise((function(resolve, reject) {
+        resolve(undefined);
+      }));
+    },
+    locate: function(load) {
+      load.url = this.locate_(load);
+      return load.url;
+    },
+    locate_: function(load) {
+      var normalizedModuleName = load.normalizedName;
+      var asJS;
+      if (load.type === 'script') {
+        asJS = normalizedModuleName;
+      } else {
+        asJS = normalizedModuleName + '.js';
+      }
+      if (options.referrer) {
+        if (asJS.indexOf(options.referrer) === 0) {
+          asJS = asJS.slice(options.referrer.length);
+          load.metadata.locateMap = {
+            pattern: options.referrer,
+            replacement: ''
+          };
+        }
+      }
+      if (isAbsolute(asJS))
+        return asJS;
+      var baseURL = load.metadata && load.metadata.baseURL;
+      baseURL = baseURL || this.baseURL;
+      if (baseURL) {
+        load.metadata.baseURL = baseURL;
+        return resolveUrl(baseURL, asJS);
+      }
+      return asJS;
+    },
+    nameTrace: function(load) {
+      var trace = '';
+      if (load.metadata.locateMap) {
+        trace += this.locateMapTrace(load);
+      }
+      var base = load.metadata.baseURL || this.baseURL;
+      if (base) {
+        trace += this.baseURLTrace(base);
+      } else {
+        trace += 'No baseURL\n';
+      }
+      return trace;
+    },
+    locateMapTrace: function(load) {
+      var map = load.metadata.locateMap;
+      return ("LoaderHooks.locate found \'" + map.pattern + "\' -> \'" + map.replacement + "\'\n");
+    },
+    baseURLTrace: function(base) {
+      return 'LoaderHooks.locate resolved against base \'' + base + '\'\n';
+    },
+    evaluateCodeUnit: function(codeUnit) {
+      var result = ('global', eval)(codeUnit.metadata.transcoded);
+      codeUnit.metadata.transformedTree = null;
+      return result;
+    },
+    analyzeDependencies: function(dependencies, loader) {
+      var deps = [];
+      for (var i = 0; i < dependencies.length; i++) {
+        var codeUnit = dependencies[i];
+        assert(codeUnit.state >= PARSED);
+        if (codeUnit.state == PARSED) {
+          deps.push(codeUnit.metadata);
+        }
+      }
+      this.exportListBuilder_.buildExportList(deps, loader);
+    },
+    get options() {
+      return options;
+    },
+    bundledModule: function(name) {
+      return this.moduleStore_.bundleStore[name];
+    }
+  }, {});
+  return {get LoaderHooks() {
+      return LoaderHooks;
+    }};
+});
+System.register("traceur@0.0.32/src/runtime/InterceptOutputLoaderHooks", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/runtime/InterceptOutputLoaderHooks";
+  var LoaderHooks = System.get("traceur@0.0.32/src/runtime/LoaderHooks").LoaderHooks;
+  var InterceptOutputLoaderHooks = function InterceptOutputLoaderHooks() {
+    for (var args = [],
+        $__326 = 0; $__326 < arguments.length; $__326++)
+      args[$__326] = arguments[$__326];
+    $traceurRuntime.superCall(this, $InterceptOutputLoaderHooks.prototype, "constructor", $traceurRuntime.spread(args));
+    this.sourceMap = null;
+    this.transcoded = null;
+    this.onTranscoded = (function() {});
+  };
+  var $InterceptOutputLoaderHooks = InterceptOutputLoaderHooks;
+  ($traceurRuntime.createClass)(InterceptOutputLoaderHooks, {instantiate: function($__327) {
+      var metadata = $__327.metadata,
+          url = $__327.url;
+      this.sourceMap = metadata.sourceMap;
+      this.transcoded = metadata.transcoded;
+      this.onTranscoded(metadata, url);
+      return undefined;
+    }}, {}, LoaderHooks);
+  return {get InterceptOutputLoaderHooks() {
+      return InterceptOutputLoaderHooks;
+    }};
+});
+System.register("traceur@0.0.32/src/runtime/InternalLoader", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/runtime/InternalLoader";
+  var ArrayMap = System.get("traceur@0.0.32/src/util/ArrayMap").ArrayMap;
+  var LoaderHooks = System.get("traceur@0.0.32/src/runtime/LoaderHooks").LoaderHooks;
+  var ObjectMap = System.get("traceur@0.0.32/src/util/ObjectMap").ObjectMap;
+  var $__330 = System.get("traceur@0.0.32/src/util/url"),
+      canonicalizeUrl = $__330.canonicalizeUrl,
+      isAbsolute = $__330.isAbsolute,
+      resolveUrl = $__330.resolveUrl;
+  var getUid = System.get("traceur@0.0.32/src/util/uid").getUid;
+  var toSource = System.get("traceur@0.0.32/src/outputgeneration/toSource").toSource;
+  var NOT_STARTED = 0;
+  var LOADING = 1;
+  var LOADED = 2;
+  var PARSED = 3;
+  var TRANSFORMING = 4;
+  var TRANSFORMED = 5;
+  var COMPLETE = 6;
+  var ERROR = 7;
+  var global = this;
+  var CodeUnit = function CodeUnit(loaderHooks, normalizedName, type, state, name, referrerName, address) {
+    var $__328 = this;
+    this.loaderHooks = loaderHooks;
+    this.normalizedName = normalizedName;
+    this.type = type;
+    this.name_ = name;
+    this.referrerName_ = referrerName;
+    this.address_ = address;
+    this.url = InternalLoader.uniqueName(normalizedName, address);
+    this.uid = getUid();
+    this.state_ = state || NOT_STARTED;
+    this.error = null;
+    this.result = null;
+    this.data_ = {};
+    this.dependencies = [];
+    this.promise = new Promise((function(res, rej) {
+      $__328.resolve = res;
+      $__328.reject = rej;
+    }));
+  };
+  ($traceurRuntime.createClass)(CodeUnit, {
+    get state() {
+      return this.state_;
+    },
+    set state(state) {
+      if (state < this.state_) {
+        throw new Error('Invalid state change');
+      }
+      this.state_ = state;
+    },
+    get metadata() {
+      return this.data_;
+    },
+    nameTrace: function() {
+      var trace = this.specifiedAs();
+      if (isAbsolute(this.name_)) {
+        return trace + 'An absolute name.\n';
+      }
+      if (this.referrerName_) {
+        return trace + this.importedBy() + this.normalizesTo();
+      }
+      return trace + this.normalizesTo();
+    },
+    specifiedAs: function() {
+      return ("Specified as " + this.name_ + ".\n");
+    },
+    importedBy: function() {
+      return ("Imported by " + this.referrerName_ + ".\n");
+    },
+    normalizesTo: function() {
+      return 'Normalizes to ' + this.normalizedName + '\n';
+    },
+    transform: function() {
+      return this.loaderHooks.transform(this);
+    },
+    instantiate: function(load) {
+      return this.loaderHooks.instantiate(this);
+    }
+  }, {});
+  var PreCompiledCodeUnit = function PreCompiledCodeUnit(loaderHooks, normalizedName, name, referrerName, address, module) {
+    $traceurRuntime.superCall(this, $PreCompiledCodeUnit.prototype, "constructor", [loaderHooks, normalizedName, 'module', COMPLETE, name, referrerName, address]);
+    this.result = module;
+    this.resolve(this.result);
+  };
+  var $PreCompiledCodeUnit = PreCompiledCodeUnit;
+  ($traceurRuntime.createClass)(PreCompiledCodeUnit, {}, {}, CodeUnit);
+  var BundledCodeUnit = function BundledCodeUnit(loaderHooks, normalizedName, name, referrerName, address, deps, execute) {
+    $traceurRuntime.superCall(this, $BundledCodeUnit.prototype, "constructor", [loaderHooks, normalizedName, 'module', TRANSFORMED, name, referrerName, address]);
+    this.deps = deps;
+    this.execute = execute;
+  };
+  var $BundledCodeUnit = BundledCodeUnit;
+  ($traceurRuntime.createClass)(BundledCodeUnit, {
+    getModuleSpecifiers: function() {
+      return this.deps;
+    },
+    evaluate: function() {
+      var $__328 = this;
+      var normalizedNames = this.deps.map((function(name) {
+        return $__328.loaderHooks.normalize(name);
+      }));
+      var module = this.execute.apply(global, normalizedNames);
+      System.set(this.normalizedName, module);
+      return module;
+    }
+  }, {}, CodeUnit);
+  var HookedCodeUnit = function HookedCodeUnit() {
+    $traceurRuntime.defaultSuperCall(this, $HookedCodeUnit.prototype, arguments);
+  };
+  var $HookedCodeUnit = HookedCodeUnit;
+  ($traceurRuntime.createClass)(HookedCodeUnit, {
+    getModuleSpecifiers: function() {
+      return this.loaderHooks.getModuleSpecifiers(this);
+    },
+    evaluate: function() {
+      return this.loaderHooks.evaluateCodeUnit(this);
+    }
+  }, {}, CodeUnit);
+  var LoadCodeUnit = function LoadCodeUnit(loaderHooks, normalizedName, name, referrerName, address) {
+    $traceurRuntime.superCall(this, $LoadCodeUnit.prototype, "constructor", [loaderHooks, normalizedName, 'module', NOT_STARTED, name, referrerName, address]);
+  };
+  var $LoadCodeUnit = LoadCodeUnit;
+  ($traceurRuntime.createClass)(LoadCodeUnit, {}, {}, HookedCodeUnit);
+  var EvalCodeUnit = function EvalCodeUnit(loaderHooks, code) {
+    var type = arguments[2] !== (void 0) ? arguments[2] : 'script';
+    var normalizedName = arguments[3];
+    var referrerName = arguments[4];
+    var address = arguments[5];
+    $traceurRuntime.superCall(this, $EvalCodeUnit.prototype, "constructor", [loaderHooks, normalizedName, type, LOADED, null, referrerName, address]);
+    this.source = code;
+  };
+  var $EvalCodeUnit = EvalCodeUnit;
+  ($traceurRuntime.createClass)(EvalCodeUnit, {}, {}, HookedCodeUnit);
+  var uniqueNameCount = 0;
+  var InternalLoader = function InternalLoader(loaderHooks) {
+    this.loaderHooks = loaderHooks;
+    this.reporter = loaderHooks.reporter;
+    this.cache = new ArrayMap();
+    this.urlToKey = Object.create(null);
+    this.sync_ = false;
+  };
+  ($traceurRuntime.createClass)(InternalLoader, {
+    load: function(name) {
+      var referrerName = arguments[1] !== (void 0) ? arguments[1] : this.loaderHooks.baseURL;
+      var address = arguments[2];
+      var type = arguments[3] !== (void 0) ? arguments[3] : 'script';
+      var codeUnit = this.load_(name, referrerName, address, type);
+      return codeUnit.promise.then((function() {
+        return codeUnit;
+      }));
+    },
+    load_: function(name, referrerName, address, type) {
+      var $__328 = this;
+      var codeUnit = this.getCodeUnit_(name, referrerName, address, type);
+      if (codeUnit.state === ERROR) {
+        return codeUnit;
+      }
+      if (codeUnit.state === TRANSFORMED) {
+        this.handleCodeUnitLoaded(codeUnit);
+      } else {
+        if (codeUnit.state !== NOT_STARTED)
+          return codeUnit;
+        codeUnit.state = LOADING;
+        codeUnit.address = this.loaderHooks.locate(codeUnit);
+        this.loaderHooks.fetch(codeUnit).then((function(text) {
+          codeUnit.source = text;
+          return codeUnit;
+        })).then(this.loaderHooks.translate.bind(this.loaderHooks)).then((function(source) {
+          codeUnit.source = source;
+          codeUnit.state = LOADED;
+          $__328.handleCodeUnitLoaded(codeUnit);
+          return codeUnit;
+        })).catch((function(err) {
+          codeUnit.state = ERROR;
+          codeUnit.abort = function() {};
+          $__328.handleCodeUnitLoadError(codeUnit);
+        }));
+      }
+      return codeUnit;
+    },
+    module: function(code, referrerName, address) {
+      var codeUnit = new EvalCodeUnit(this.loaderHooks, code, 'module', null, referrerName, address);
+      this.cache.set({}, codeUnit);
+      this.handleCodeUnitLoaded(codeUnit);
+      return codeUnit.promise;
+    },
+    define: function(normalizedName, code, address) {
+      var codeUnit = new EvalCodeUnit(this.loaderHooks, code, 'module', normalizedName, null, address);
+      var key = this.getKey(normalizedName, 'module');
+      this.cache.set(key, codeUnit);
+      this.handleCodeUnitLoaded(codeUnit);
+      return codeUnit.promise;
+    },
+    script: function(code, name, referrerName, address) {
+      var normalizedName = System.normalize(name || '', referrerName, address);
+      var codeUnit = new EvalCodeUnit(this.loaderHooks, code, 'script', normalizedName, referrerName, address);
+      var key = {};
+      if (name)
+        key = this.getKey(normalizedName, 'script');
+      this.cache.set(key, codeUnit);
+      this.handleCodeUnitLoaded(codeUnit);
+      return codeUnit.promise;
+    },
+    get options() {
+      return this.loaderHooks.options;
+    },
+    sourceMapInfo: function(normalizedName, type) {
+      var key = this.getKey(normalizedName, type);
+      var codeUnit = this.cache.get(key);
+      return {
+        sourceMap: codeUnit && codeUnit.metadata && codeUnit.metadata.sourceMap,
+        url: codeUnit && codeUnit.url
+      };
+    },
+    getKey: function(url, type) {
+      var combined = type + ':' + url;
+      if (combined in this.urlToKey) {
+        return this.urlToKey[combined];
+      }
+      return this.urlToKey[combined] = {};
+    },
+    getCodeUnit_: function(name, referrerName, address, type) {
+      var normalizedName = System.normalize(name, referrerName, address);
+      var key = this.getKey(normalizedName, type);
+      var cacheObject = this.cache.get(key);
+      if (!cacheObject) {
+        var module = this.loaderHooks.get(normalizedName);
+        if (module) {
+          cacheObject = new PreCompiledCodeUnit(this.loaderHooks, normalizedName, name, referrerName, address, module);
+          cacheObject.type = 'module';
+        } else {
+          var bundledModule = this.loaderHooks.bundledModule(name);
+          if (bundledModule) {
+            cacheObject = new BundledCodeUnit(this.loaderHooks, normalizedName, name, referrerName, address, bundledModule.deps, bundledModule.execute);
+          } else {
+            cacheObject = new LoadCodeUnit(this.loaderHooks, normalizedName, name, referrerName, address);
+            cacheObject.type = type;
+          }
+        }
+        this.cache.set(key, cacheObject);
+      }
+      return cacheObject;
+    },
+    areAll: function(state) {
+      return this.cache.values().every((function(codeUnit) {
+        return codeUnit.state >= state;
+      }));
+    },
+    getCodeUnitForModuleSpecifier: function(name, referrerName) {
+      return this.getCodeUnit_(name, referrerName, null, 'module');
+    },
+    handleCodeUnitLoaded: function(codeUnit) {
+      var $__328 = this;
+      var referrerName = codeUnit.normalizedName;
+      var moduleSpecifiers = codeUnit.getModuleSpecifiers();
+      if (!moduleSpecifiers) {
+        this.abortAll(("No module specifiers in " + referrerName));
+        return;
+      }
+      codeUnit.dependencies = moduleSpecifiers.sort().map((function(name) {
+        return $__328.getCodeUnit_(name, referrerName, null, 'module');
+      }));
+      codeUnit.dependencies.forEach((function(dependency) {
+        $__328.load(dependency.normalizedName, null, null, 'module');
+      }));
+      if (this.areAll(PARSED)) {
+        this.analyze();
+        this.transform();
+        this.evaluate();
+      }
+    },
+    handleCodeUnitLoadError: function(codeUnit) {
+      var message = ("Failed to load '" + codeUnit.address + "'.\n") + codeUnit.nameTrace() + this.loaderHooks.nameTrace(codeUnit);
+      this.reporter.reportError(null, message);
+      this.abortAll(message);
+      codeUnit.error = message;
+      codeUnit.reject(new Error(message));
+    },
+    abortAll: function(errorMessage) {
+      this.cache.values().forEach((function(codeUnit) {
+        if (codeUnit.abort) {
+          codeUnit.abort();
+          codeUnit.state = ERROR;
+        }
+      }));
+      this.cache.values().forEach((function(codeUnit) {
+        codeUnit.reject(new Error(codeUnit.error || errorMessage));
+      }));
+    },
+    analyze: function() {
+      this.loaderHooks.analyzeDependencies(this.cache.values(), this);
+      this.checkForErrors(this.cache.values(), 'build-export-list');
+    },
+    transform: function() {
+      this.transformDependencies(this.cache.values());
+    },
+    transformDependencies: function(dependencies, dependentName) {
+      for (var i = 0; i < dependencies.length; i++) {
+        var codeUnit = dependencies[i];
+        if (codeUnit.state >= TRANSFORMED) {
+          continue;
+        }
+        if (codeUnit.state === TRANSFORMING) {
+          var cir = codeUnit.normalizedName;
+          var cle = dependentName;
+          this.reporter.reportError(codeUnit.metadata.tree, ("Unsupported circular dependency between " + cir + " and " + cle));
+          break;
+        }
+        codeUnit.state = TRANSFORMING;
+        this.transformCodeUnit(codeUnit);
+        codeUnit.instantiate();
+      }
+      this.checkForErrors(dependencies, 'transform');
+    },
+    transformCodeUnit: function(codeUnit) {
+      var $__330;
+      this.transformDependencies(codeUnit.dependencies, codeUnit.normalizedName);
+      if (codeUnit.state === ERROR)
+        return;
+      var metadata = codeUnit.metadata;
+      metadata.transformedTree = codeUnit.transform();
+      codeUnit.state = TRANSFORMED;
+      var filename = codeUnit.address || codeUnit.normalizedName;
+      ($__330 = toSource(metadata.transformedTree, this.options, filename), metadata.transcoded = $__330[0], metadata.sourceMap = $__330[1], $__330);
+      if (codeUnit.address && metadata.transcoded)
+        metadata.transcoded += '//# sourceURL=' + codeUnit.address;
+    },
+    checkForErrors: function(dependencies, phase) {
+      if (this.reporter.hadError()) {
+        for (var i = 0; i < dependencies.length; i++) {
+          var codeUnit = dependencies[i];
+          if (codeUnit.state >= COMPLETE) {
+            continue;
+          }
+          codeUnit.state = ERROR;
+        }
+        for (var i = 0; i < dependencies.length; i++) {
+          var codeUnit = dependencies[i];
+          if (codeUnit.state == ERROR) {
+            codeUnit.reject(phase);
+          }
+        }
+        return true;
+      }
+      return false;
+    },
+    orderDependencies: function() {
+      var visited = new ObjectMap();
+      var ordered = [];
+      function orderCodeUnits(codeUnit) {
+        if (visited.has(codeUnit)) {
+          return;
+        }
+        visited.set(codeUnit, true);
+        codeUnit.dependencies.forEach(orderCodeUnits);
+        ordered.push(codeUnit);
+      }
+      this.cache.values().forEach(orderCodeUnits);
+      return ordered;
+    },
+    evaluate: function() {
+      var dependencies = this.orderDependencies();
+      for (var i = 0; i < dependencies.length; i++) {
+        var codeUnit = dependencies[i];
+        if (codeUnit.state >= COMPLETE) {
+          continue;
+        }
+        var result;
+        try {
+          result = codeUnit.evaluate();
+        } catch (ex) {
+          codeUnit.error = ex;
+          this.reporter.reportError(null, String(ex));
+          this.abortAll();
+          codeUnit.reject(codeUnit.error);
+          return;
+        }
+        codeUnit.result = result;
+        codeUnit.source = null;
+      }
+      for (var i = 0; i < dependencies.length; i++) {
+        var codeUnit = dependencies[i];
+        if (codeUnit.state >= COMPLETE) {
+          continue;
+        }
+        codeUnit.state = COMPLETE;
+        codeUnit.resolve(codeUnit.result);
+      }
+    }
+  }, {uniqueName: function(normalizedName, referrerAddress) {
+      var importerAddress = referrerAddress || System.baseURL;
+      if (!importerAddress)
+        throw new Error('The System.baseURL is an empty string');
+      var path = normalizedName || String(uniqueNameCount++);
+      return resolveUrl(importerAddress, path);
+    }});
+  var SystemLoaderHooks = LoaderHooks;
+  var internals = {
+    CodeUnit: CodeUnit,
+    EvalCodeUnit: EvalCodeUnit,
+    LoadCodeUnit: LoadCodeUnit,
+    LoaderHooks: LoaderHooks
+  };
+  return {
+    get InternalLoader() {
+      return InternalLoader;
+    },
+    get internals() {
+      return internals;
+    }
+  };
+});
+System.register("traceur@0.0.32/src/runtime/Loader", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/runtime/Loader";
+  var InternalLoader = System.get("traceur@0.0.32/src/runtime/InternalLoader").InternalLoader;
+  var Loader = function Loader(loaderHooks) {
+    this.internalLoader_ = new InternalLoader(loaderHooks);
+    this.loaderHooks_ = loaderHooks;
+  };
+  ($traceurRuntime.createClass)(Loader, {
+    import: function(name) {
+      var $__333 = arguments[1] !== (void 0) ? arguments[1] : {},
+          referrerName = $__333.referrerName,
+          address = $__333.address;
+      var $__331 = this;
+      return this.internalLoader_.load(name, referrerName, address, 'module').then((function(codeUnit) {
+        return $__331.get(codeUnit.normalizedName);
+      }));
+    },
+    module: function(source) {
+      var $__333 = arguments[1] !== (void 0) ? arguments[1] : {},
+          referrerName = $__333.referrerName,
+          address = $__333.address;
+      return this.internalLoader_.module(source, referrerName, address);
+    },
+    define: function(normalizedName, source) {
+      var $__333 = arguments[2] !== (void 0) ? arguments[2] : {},
+          address = $__333.address,
+          metadata = $__333.metadata;
+      return this.internalLoader_.define(normalizedName, source, address, metadata);
+    },
+    get: function(normalizedName) {
+      return this.loaderHooks_.get(normalizedName);
+    },
+    set: function(normalizedName, module) {
+      this.loaderHooks_.set(normalizedName, module);
+    },
+    normalize: function(name, referrerName, referrerAddress) {
+      return this.loaderHooks_.normalize(name, referrerName, referrerAddress);
+    },
+    locate: function(load) {
+      return this.loaderHooks_.locate(load);
+    },
+    fetch: function(load) {
+      return this.loaderHooks_.fetch(load);
+    },
+    translate: function(load) {
+      return this.loaderHooks_.translate(load);
+    },
+    instantiate: function(load) {
+      return this.loaderHooks_.instantiate(load);
+    }
+  }, {});
+  ;
+  return {
+    get Loader() {
+      return Loader;
+    },
+    get LoaderHooks() {
+      return LoaderHooks;
+    }
+  };
+});
+System.register("traceur@0.0.32/src/WebPageTranscoder", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/WebPageTranscoder";
+  var Loader = System.get("traceur@0.0.32/src/runtime/Loader").Loader;
+  var ErrorReporter = System.get("traceur@0.0.32/src/util/ErrorReporter").ErrorReporter;
+  var InterceptOutputLoaderHooks = System.get("traceur@0.0.32/src/runtime/InterceptOutputLoaderHooks").InterceptOutputLoaderHooks;
+  var webLoader = System.get("traceur@0.0.32/src/runtime/webLoader").webLoader;
+  var WebPageTranscoder = function WebPageTranscoder(url) {
+    this.url = url;
+    this.numPending_ = 0;
+    this.numberInlined_ = 0;
+  };
+  ($traceurRuntime.createClass)(WebPageTranscoder, {
+    asyncLoad_: function(url, fncOfContent, onScriptsReady) {
+      var $__334 = this;
+      this.numPending_++;
+      webLoader.load(url, (function(content) {
+        if (content)
+          fncOfContent(content);
+        else
+          console.warn('Failed to load', url);
+        if (--$__334.numPending_ <= 0)
+          onScriptsReady();
+      }), (function(error) {
+        console.error('WebPageTranscoder FAILED to load ' + url, error);
+      }));
+    },
+    addFileFromScriptElement: function(scriptElement, name, content) {
+      this.loader.module(content, name);
+    },
+    nextInlineScriptName_: function() {
+      this.numberInlined_ += 1;
+      if (!this.inlineScriptNameBase_) {
+        var segments = this.url.split('.');
+        segments.pop();
+        this.inlineScriptNameBase_ = segments.join('.');
+      }
+      return this.inlineScriptNameBase_ + '_' + this.numberInlined_ + '.js';
+    },
+    addFilesFromScriptElements: function(scriptElements, onScriptsReady) {
+      for (var i = 0,
+          length = scriptElements.length; i < length; i++) {
+        var scriptElement = scriptElements[i];
+        if (!scriptElement.src) {
+          var name = this.nextInlineScriptName_();
+          var content = scriptElement.textContent;
+          this.addFileFromScriptElement(scriptElement, name, content);
+        } else {
+          var name = scriptElement.src;
+          this.asyncLoad_(name, this.addFileFromScriptElement.bind(this, scriptElement, name), onScriptsReady);
+        }
+      }
+      if (this.numPending_ <= 0)
+        onScriptsReady();
+    },
+    get reporter() {
+      if (!this.reporter_) {
+        this.reporter_ = new ErrorReporter();
+      }
+      return this.reporter_;
+    },
+    get loader() {
+      if (!this.loader_) {
+        var loaderHooks = new InterceptOutputLoaderHooks(this.reporter, this.url);
+        this.loader_ = new Loader(loaderHooks);
+      }
+      return this.loader_;
+    },
+    putFile: function(file) {
+      var scriptElement = document.createElement('script');
+      scriptElement.setAttribute('data-traceur-src-url', file.name);
+      scriptElement.textContent = file.generatedSource;
+      var parent = file.scriptElement.parentNode;
+      parent.insertBefore(scriptElement, file.scriptElement || null);
+    },
+    selectAndProcessScripts: function(done) {
+      var selector = 'script[type="module"]';
+      var scripts = document.querySelectorAll(selector);
+      if (!scripts.length) {
+        done();
+        return;
+      }
+      this.addFilesFromScriptElements(scripts, (function() {
+        done();
+      }));
+    },
+    run: function() {
+      var done = arguments[0] !== (void 0) ? arguments[0] : (function() {});
+      var $__334 = this;
+      var ready = document.readyState;
+      if (ready === 'complete' || ready === 'loaded') {
+        this.selectAndProcessScripts(done);
+      } else {
+        document.addEventListener('DOMContentLoaded', (function() {
+          return $__334.selectAndProcessScripts(done);
+        }), false);
+      }
+    }
+  }, {});
+  return {get WebPageTranscoder() {
+      return WebPageTranscoder;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/CloneTreeTransformer", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/CloneTreeTransformer";
+  var ParseTreeTransformer = System.get("traceur@0.0.32/src/codegeneration/ParseTreeTransformer").ParseTreeTransformer;
+  var $__338 = System.get("traceur@0.0.32/src/syntax/trees/ParseTrees"),
+      BindingIdentifier = $__338.BindingIdentifier,
+      BreakStatement = $__338.BreakStatement,
+      ContinueStatement = $__338.ContinueStatement,
+      DebuggerStatement = $__338.DebuggerStatement,
+      EmptyStatement = $__338.EmptyStatement,
+      ExportSpecifier = $__338.ExportSpecifier,
+      ExportStar = $__338.ExportStar,
+      IdentifierExpression = $__338.IdentifierExpression,
+      ImportSpecifier = $__338.ImportSpecifier,
+      LiteralExpression = $__338.LiteralExpression,
+      ModuleSpecifier = $__338.ModuleSpecifier,
+      PredefinedType = $__338.PredefinedType,
+      PropertyNameShorthand = $__338.PropertyNameShorthand,
+      TemplateLiteralPortion = $__338.TemplateLiteralPortion,
+      RestParameter = $__338.RestParameter,
+      SuperExpression = $__338.SuperExpression,
+      ThisExpression = $__338.ThisExpression;
+  var CloneTreeTransformer = function CloneTreeTransformer() {
+    $traceurRuntime.defaultSuperCall(this, $CloneTreeTransformer.prototype, arguments);
+  };
+  var $CloneTreeTransformer = CloneTreeTransformer;
+  ($traceurRuntime.createClass)(CloneTreeTransformer, {
+    transformBindingIdentifier: function(tree) {
+      return new BindingIdentifier(tree.location, tree.identifierToken);
+    },
+    transformBreakStatement: function(tree) {
+      return new BreakStatement(tree.location, tree.name);
+    },
+    transformContinueStatement: function(tree) {
+      return new ContinueStatement(tree.location, tree.name);
+    },
+    transformDebuggerStatement: function(tree) {
+      return new DebuggerStatement(tree.location);
+    },
+    transformEmptyStatement: function(tree) {
+      return new EmptyStatement(tree.location);
+    },
+    transformExportSpecifier: function(tree) {
+      return new ExportSpecifier(tree.location, tree.lhs, tree.rhs);
+    },
+    transformExportStar: function(tree) {
+      return new ExportStar(tree.location);
+    },
+    transformIdentifierExpression: function(tree) {
+      return new IdentifierExpression(tree.location, tree.identifierToken);
+    },
+    transformImportSpecifier: function(tree) {
+      return new ImportSpecifier(tree.location, tree.lhs, tree.rhs);
+    },
+    transformList: function(list) {
+      if (!list) {
+        return null;
+      } else if (list.length == 0) {
+        return [];
+      } else {
+        return $traceurRuntime.superCall(this, $CloneTreeTransformer.prototype, "transformList", [list]);
+      }
+    },
+    transformLiteralExpression: function(tree) {
+      return new LiteralExpression(tree.location, tree.literalToken);
+    },
+    transformModuleSpecifier: function(tree) {
+      return new ModuleSpecifier(tree.location, tree.token);
+    },
+    transformPredefinedType: function(tree) {
+      return new PredefinedType(tree.location, tree.typeToken);
+    },
+    transformPropertyNameShorthand: function(tree) {
+      return new PropertyNameShorthand(tree.location, tree.name);
+    },
+    transformTemplateLiteralPortion: function(tree) {
+      return new TemplateLiteralPortion(tree.location, tree.value);
+    },
+    transformSuperExpression: function(tree) {
+      return new SuperExpression(tree.location);
+    },
+    transformThisExpression: function(tree) {
+      return new ThisExpression(tree.location);
+    }
+  }, {}, ParseTreeTransformer);
+  CloneTreeTransformer.cloneTree = function(tree) {
+    return new CloneTreeTransformer().transformAny(tree);
+  };
+  return {get CloneTreeTransformer() {
+      return CloneTreeTransformer;
+    }};
+});
+System.register("traceur@0.0.32/src/codegeneration/module/createModuleEvaluationStatement", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/codegeneration/module/createModuleEvaluationStatement";
+  var $__339 = Object.freeze(Object.defineProperties(["System.get(", " +'')"], {raw: {value: Object.freeze(["System.get(", " +'')"])}}));
+  var parseStatement = System.get("traceur@0.0.32/src/codegeneration/PlaceholderParser").parseStatement;
+  function createModuleEvaluationStatement(normalizedName) {
+    return parseStatement($__339, normalizedName);
+  }
+  return {get createModuleEvaluationStatement() {
+      return createModuleEvaluationStatement;
+    }};
+});
+System.register("traceur@0.0.32/src/runtime/TraceurLoader", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/runtime/TraceurLoader";
+  var InternalLoader = System.get("traceur@0.0.32/src/runtime/InternalLoader").InternalLoader;
+  var Loader = System.get("traceur@0.0.32/src/runtime/Loader").Loader;
+  var version = __moduleName.slice(0, __moduleName.indexOf('/'));
+  var TraceurLoader = function TraceurLoader(loaderHooks) {
+    if (loaderHooks.translateSynchronous) {
+      loaderHooks.translate = function(load) {
+        return new Promise((function(resolve, reject) {
+          resolve(loaderHooks.translateSynchronous(load));
+        }));
+      };
+    }
+    $traceurRuntime.superCall(this, $TraceurLoader.prototype, "constructor", [loaderHooks]);
+  };
+  var $TraceurLoader = TraceurLoader;
+  ($traceurRuntime.createClass)(TraceurLoader, {
+    loadAsScript: function(name) {
+      var $__342 = arguments[1] !== (void 0) ? arguments[1] : {},
+          referrerName = $__342.referrerName,
+          address = $__342.address;
+      return this.internalLoader_.load(name, referrerName, address, 'script').then((function(codeUnit) {
+        return codeUnit.result;
+      }));
+    },
+    script: function(source) {
+      var $__342 = arguments[1] !== (void 0) ? arguments[1] : {},
+          name = $__342.name,
+          referrerName = $__342.referrerName,
+          address = $__342.address;
+      return this.internalLoader_.script(source, name, referrerName, address);
+    },
+    semVerRegExp_: function() {
+      return /^(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?(?:\+[0-9A-Za-z-]+)?$/;
+    },
+    semverMap: function(normalizedName) {
+      var slash = normalizedName.indexOf('/');
+      var version = normalizedName.slice(0, slash);
+      var at = version.indexOf('@');
+      if (at !== -1) {
+        var semver = version.slice(at + 1);
+        var m = this.semVerRegExp_().exec(semver);
+        if (m) {
+          var major = m[1];
+          var minor = m[2];
+          var packageName = version.slice(0, at);
+          var map = Object.create(null);
+          map[packageName] = version;
+          map[packageName + '@' + major] = version;
+          map[packageName + '@' + major + '.' + minor] = version;
+        }
+      }
+      return map;
+    },
+    get version() {
+      return version;
+    },
+    get options() {
+      return this.internalLoader_.options;
+    },
+    sourceMapInfo: function(normalizedName, type) {
+      return this.internalLoader_.sourceMapInfo(normalizedName, type);
+    },
+    register: function(normalizedName, deps, factoryFunction) {
+      $traceurRuntime.ModuleStore.register(normalizedName, deps, factoryFunction);
+    },
+    get baseURL() {
+      return this.loaderHooks_.baseURL;
+    },
+    set baseURL(value) {
+      this.loaderHooks_.baseURL = value;
+    }
+  }, {}, Loader);
+  return {get TraceurLoader() {
+      return TraceurLoader;
+    }};
+});
+System.register("traceur@0.0.32/src/runtime/System", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/runtime/System";
+  var globalThis = System.get("traceur@0.0.32/src/codegeneration/globalThis").default;
+  var ErrorReporter = System.get("traceur@0.0.32/src/util/ErrorReporter").ErrorReporter;
+  var TraceurLoader = System.get("traceur@0.0.32/src/runtime/TraceurLoader").TraceurLoader;
+  var LoaderHooks = System.get("traceur@0.0.32/src/runtime/LoaderHooks").LoaderHooks;
+  var options = System.get("traceur@0.0.32/src/options").options;
+  var webLoader = System.get("traceur@0.0.32/src/runtime/webLoader").webLoader;
+  var url;
+  var fileLoader;
+  if (typeof window !== 'undefined' && window.location) {
+    url = window.location.href;
+    fileLoader = webLoader;
+  }
+  var loaderHooks = new LoaderHooks(new ErrorReporter(), url, fileLoader);
+  var traceurLoader = new TraceurLoader(loaderHooks);
+  if (typeof window !== 'undefined')
+    window.System = traceurLoader;
+  if (typeof global !== 'undefined')
+    global.System = traceurLoader;
+  ;
+  traceurLoader.map = traceurLoader.semverMap(__moduleName);
+  return {get System() {
+      return traceurLoader;
+    }};
+});
+System.register("traceur@0.0.32/src/util/TestErrorReporter", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/util/TestErrorReporter";
+  var $__345 = System.get("traceur@0.0.32/src/util/ErrorReporter"),
+      ErrorReporter = $__345.ErrorReporter,
+      format = $__345.format;
+  var TestErrorReporter = function TestErrorReporter() {
+    this.errors = [];
+  };
+  ($traceurRuntime.createClass)(TestErrorReporter, {
+    reportMessageInternal: function(location, message) {
+      this.errors.push(format(location, message));
+    },
+    hasMatchingError: function(expected) {
+      return this.errors.some((function(error) {
+        return error.indexOf(expected) !== -1;
+      }));
+    }
+  }, {}, ErrorReporter);
+  return {get TestErrorReporter() {
+      return TestErrorReporter;
+    }};
+});
+System.register("traceur@0.0.32/src/traceur", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/traceur";
+  System.get("traceur@0.0.32/src/runtime/System");
+  ;
+  var ModuleStore = System.get('@traceur/src/runtime/ModuleStore').ModuleStore;
+  var $__traceur_64_0_46_0_46_32_47_src_47_options__ = System.get("traceur@0.0.32/src/options");
+  var $__traceur_64_0_46_0_46_32_47_src_47_WebPageTranscoder__ = System.get("traceur@0.0.32/src/WebPageTranscoder");
+  var ExportListBuilder = System.get("traceur@0.0.32/src/codegeneration/module/ExportListBuilder").ExportListBuilder;
+  var semantics = {ExportListBuilder: ExportListBuilder};
+  var ErrorReporter = System.get("traceur@0.0.32/src/util/ErrorReporter").ErrorReporter;
+  var SourcePosition = System.get("traceur@0.0.32/src/util/SourcePosition").SourcePosition;
+  var SyntaxErrorReporter = System.get("traceur@0.0.32/src/util/SyntaxErrorReporter").SyntaxErrorReporter;
+  var TestErrorReporter = System.get("traceur@0.0.32/src/util/TestErrorReporter").TestErrorReporter;
+  var resolveUrl = System.get("traceur@0.0.32/src/util/url").resolveUrl;
+  var util = {
+    ErrorReporter: ErrorReporter,
+    SourcePosition: SourcePosition,
+    SyntaxErrorReporter: SyntaxErrorReporter,
+    TestErrorReporter: TestErrorReporter,
+    resolveUrl: resolveUrl
+  };
+  var IdentifierToken = System.get("traceur@0.0.32/src/syntax/IdentifierToken").IdentifierToken;
+  var LiteralToken = System.get("traceur@0.0.32/src/syntax/LiteralToken").LiteralToken;
+  var Parser = System.get("traceur@0.0.32/src/syntax/Parser").Parser;
+  var Scanner = System.get("traceur@0.0.32/src/syntax/Scanner").Scanner;
+  var SourceFile = System.get("traceur@0.0.32/src/syntax/SourceFile").SourceFile;
+  var Token = System.get("traceur@0.0.32/src/syntax/Token").Token;
+  var TokenType = System.get("traceur@0.0.32/src/syntax/TokenType");
+  var trees = System.get("traceur@0.0.32/src/syntax/trees/ParseTrees");
+  var syntax = {
+    IdentifierToken: IdentifierToken,
+    LiteralToken: LiteralToken,
+    Parser: Parser,
+    Scanner: Scanner,
+    SourceFile: SourceFile,
+    Token: Token,
+    TokenType: TokenType,
+    trees: trees
+  };
+  var ParseTreeMapWriter = System.get("traceur@0.0.32/src/outputgeneration/ParseTreeMapWriter").ParseTreeMapWriter;
+  var ParseTreeWriter = System.get("traceur@0.0.32/src/outputgeneration/ParseTreeWriter").ParseTreeWriter;
+  var SourceMapConsumer = System.get("traceur@0.0.32/src/outputgeneration/SourceMapIntegration").SourceMapConsumer;
+  var SourceMapGenerator = System.get("traceur@0.0.32/src/outputgeneration/SourceMapIntegration").SourceMapGenerator;
+  var TreeWriter = System.get("traceur@0.0.32/src/outputgeneration/TreeWriter").TreeWriter;
+  var outputgeneration = {
+    ParseTreeMapWriter: ParseTreeMapWriter,
+    ParseTreeWriter: ParseTreeWriter,
+    SourceMapConsumer: SourceMapConsumer,
+    SourceMapGenerator: SourceMapGenerator,
+    TreeWriter: TreeWriter
+  };
+  var AmdTransformer = System.get("traceur@0.0.32/src/codegeneration/AmdTransformer").AmdTransformer;
+  var AttachModuleNameTransformer = System.get("traceur@0.0.32/src/codegeneration/module/AttachModuleNameTransformer").AttachModuleNameTransformer;
+  var CloneTreeTransformer = System.get("traceur@0.0.32/src/codegeneration/CloneTreeTransformer").CloneTreeTransformer;
+  var CommonJsModuleTransformer = System.get("traceur@0.0.32/src/codegeneration/CommonJsModuleTransformer").CommonJsModuleTransformer;
+  var DirectExportVisitor = System.get("traceur@0.0.32/src/codegeneration/module/DirectExportVisitor").DirectExportVisitor;
+  var FromOptionsTransformer = System.get("traceur@0.0.32/src/codegeneration/FromOptionsTransformer").FromOptionsTransformer;
+  var InlineModuleTransformer = System.get("traceur@0.0.32/src/codegeneration/InlineModuleTransformer").InlineModuleTransformer;
+  var ModuleSpecifierVisitor = System.get("traceur@0.0.32/src/codegeneration/module/ModuleSpecifierVisitor").ModuleSpecifierVisitor;
+  var ModuleTransformer = System.get("traceur@0.0.32/src/codegeneration/ModuleTransformer").ModuleTransformer;
+  var ParseTreeTransformer = System.get("traceur@0.0.32/src/codegeneration/ParseTreeTransformer").ParseTreeTransformer;
+  var createModuleEvaluationStatement = System.get("traceur@0.0.32/src/codegeneration/module/createModuleEvaluationStatement").createModuleEvaluationStatement;
+  var ParseTreeFactory = System.get("traceur@0.0.32/src/codegeneration/ParseTreeFactory");
+  var codegeneration = {
+    AmdTransformer: AmdTransformer,
+    CloneTreeTransformer: CloneTreeTransformer,
+    CommonJsModuleTransformer: CommonJsModuleTransformer,
+    FromOptionsTransformer: FromOptionsTransformer,
+    InlineModuleTransformer: InlineModuleTransformer,
+    ModuleTransformer: ModuleTransformer,
+    ParseTreeFactory: ParseTreeFactory,
+    ParseTreeTransformer: ParseTreeTransformer,
+    module: {
+      AttachModuleNameTransformer: AttachModuleNameTransformer,
+      DirectExportVisitor: DirectExportVisitor,
+      ModuleSpecifierVisitor: ModuleSpecifierVisitor,
+      createModuleEvaluationStatement: createModuleEvaluationStatement
+    }
+  };
+  var Loader = System.get("traceur@0.0.32/src/runtime/Loader").Loader;
+  var LoaderHooks = System.get("traceur@0.0.32/src/runtime/LoaderHooks").LoaderHooks;
+  var InterceptOutputLoaderHooks = System.get("traceur@0.0.32/src/runtime/InterceptOutputLoaderHooks").InterceptOutputLoaderHooks;
+  var TraceurLoader = System.get("traceur@0.0.32/src/runtime/TraceurLoader").TraceurLoader;
+  var runtime = {
+    InterceptOutputLoaderHooks: InterceptOutputLoaderHooks,
+    Loader: Loader,
+    LoaderHooks: LoaderHooks,
+    TraceurLoader: TraceurLoader
+  };
+  return {
+    get System() {
+      return System;
+    },
+    get ModuleStore() {
+      return ModuleStore;
+    },
+    get options() {
+      return $__traceur_64_0_46_0_46_32_47_src_47_options__.options;
+    },
+    get WebPageTranscoder() {
+      return $__traceur_64_0_46_0_46_32_47_src_47_WebPageTranscoder__.WebPageTranscoder;
+    },
+    get semantics() {
+      return semantics;
+    },
+    get util() {
+      return util;
+    },
+    get syntax() {
+      return syntax;
+    },
+    get outputgeneration() {
+      return outputgeneration;
+    },
+    get codegeneration() {
+      return codegeneration;
+    },
+    get runtime() {
+      return runtime;
+    }
+  };
+});
+System.register("traceur@0.0.32/src/traceur-import", [], function() {
+  "use strict";
+  var __moduleName = "traceur@0.0.32/src/traceur-import";
+  var traceur = System.get("traceur@0.0.32/src/traceur");
+  this.traceur = traceur;
+  $traceurRuntime.ModuleStore.set('traceur@', traceur);
+  return {};
+});
+System.get("traceur@0.0.32/src/traceur-import" + '');
diff --git a/examples/pipetobrowser/browser/pipe-viewers/builtin/README b/examples/pipetobrowser/browser/pipe-viewers/builtin/README
new file mode 100644
index 0000000..15846d1
--- /dev/null
+++ b/examples/pipetobrowser/browser/pipe-viewers/builtin/README
@@ -0,0 +1,7 @@
+A pipe viewer plugin is a piece of code that can format/play/display an stream of bytes.
+
+Each pipe viewer plugin must do a default export of a class that extends the PipeViewer interface.
+
+"builtin" folder contains pipe viewers that come built-in with PipeToBrowser application.
+
+Plugin loader expects the folder and file name to match the viewer's name.
\ No newline at end of file
diff --git a/examples/pipetobrowser/browser/pipe-viewers/builtin/console/console.js b/examples/pipetobrowser/browser/pipe-viewers/builtin/console/console.js
new file mode 100644
index 0000000..1982003
--- /dev/null
+++ b/examples/pipetobrowser/browser/pipe-viewers/builtin/console/console.js
@@ -0,0 +1,33 @@
+/*
+ * Console is a Pipe Viewer that displays a text stream as unformatted text
+ * @fileoverview
+ */
+
+import { View } from 'view';
+import { PipeViewer } from 'pipe-viewer';
+
+import { arrayBufferToString } from 'libs/utils/array-buffer'
+
+class ConsolePipeViewer extends PipeViewer {
+  get name() {
+    return 'console';
+  }
+
+  play(stream) {
+    var textarea = document.createElement('textarea');
+    textarea.readonly = true;
+    textarea.cols = 100;
+    textarea.rows = 15;
+    var chunk;
+    stream.on('readable', () => {
+      while(null !== (chunk = stream.read())) {
+        var buf = arrayBufferToString(chunk);
+        textarea.value += buf;
+      }
+    });
+
+    return new View(textarea);
+  }
+}
+
+export default ConsolePipeViewer;
\ No newline at end of file
diff --git a/examples/pipetobrowser/browser/pipe-viewers/manager.js b/examples/pipetobrowser/browser/pipe-viewers/manager.js
new file mode 100644
index 0000000..cde1d1b
--- /dev/null
+++ b/examples/pipetobrowser/browser/pipe-viewers/manager.js
@@ -0,0 +1,77 @@
+/*
+ * Pipe viewer manager is used to load and get an instance of a pipe viewer
+ * given its name.
+ *
+ * Manager handles on-demand loading and caching of pipe viewers.
+ * @fileoverview
+ */
+
+import { isAbsoulteUrl } from 'libs/utils/url'
+import { Logger } from 'libs/logs/logger'
+
+var log = new Logger('pipe-viwer/manager');
+
+// cache loaded viewers
+var loadedPipeViewers = {};
+
+/*
+ * Asynchronously loads and returns a PipeViewer plugin instance given its name.
+ * @param {string} name Unique name of the viewer.
+ * @return {Promise<PipeViewer>} pipe viewer for the given name
+ */
+export function get(name) {
+  if(isLoaded(name)) {
+    return Promise.resolve(new loadedPipeViewers[name]());
+  }
+
+  return loadViewer(name).then((viewerClass) => {
+    return new viewerClass();
+  }).catch((e) => { return Promise.reject(e); });
+}
+
+/*
+ * Tests whether the viewer plugin is already loaded or not.
+ * @param {string} name Unique name of the viewer.
+ * @return {string} Whether the viewer plugin is already loaded or not.
+ *
+ * @private
+ */
+function isLoaded(name) {
+  return loadedPipeViewers[name] !== undefined
+}
+
+/*
+ * Registers a pipeViewer under a unique name and make it available to be called
+ * @param {string} name Unique name of the viewer.
+ * @return {Promise} when import completes.
+ *
+ * @private
+ */
+function loadViewer(name) {
+  log.debug('loading viewer:', name);
+
+  var path = getPath(name);
+  return System.import(path).then((module) => {
+    var pipeViewerClass = module.default;
+    loadedPipeViewers[name] = pipeViewerClass;
+    return pipeViewerClass;
+  }).catch((e) => {
+    log.debug('could not load viewer JavaScript module for:', name, e);
+    return Promise.reject(e);
+  })
+}
+
+/*
+ * Returns the path to a pipe viewer module location based on its name.
+ * @param {string} name Unique name of the viewer.
+ * @return {string} path to a pipe viewer module location.
+ *
+ * @private
+ */
+function getPath(name) {
+  if(isAbsoulteUrl(name)) {
+    return name;
+  } else {
+    return 'pipe-viewers/builtin/' + name + '/' + name;
+  }
+}
diff --git a/examples/pipetobrowser/browser/pipe-viewers/pipe-viewer.js b/examples/pipetobrowser/browser/pipe-viewers/pipe-viewer.js
new file mode 100644
index 0000000..738fb01
--- /dev/null
+++ b/examples/pipetobrowser/browser/pipe-viewers/pipe-viewer.js
@@ -0,0 +1,32 @@
+/*
+ * Defines the interface expected to be implemented by any pipe viewer plugin.
+ * A PipeViewer is an object that can render a stream of data.
+ *
+ * It has a unique name which is used to find the viewer plugin and direct
+ * requests to it.
+ *
+ * It has a play function that will be called and supplied by a stream object.
+ * play(stream) needs to return a View or promise of a View
+ * that will be appended to the UI by the p2b framework.
+ * If a promise, p2b UI will display a loading widget until promise is resolved.
+ */
+export class PipeViewer {
+
+  /*
+   * @property {string} name Unique name of the viewer.
+   */
+  get name() {
+    throw new Error('Abstract method. Must be implemented by subclasses');
+  }
+
+  /*
+   * play() function is called by the p2b framework when a pipe request for the
+   * this specific pipe viewer comes in.
+   * @param {Veyron.Stream} stream Stream of data to be displayed.
+   * @return {Promise<View>|{View}} a View or a promise of an
+   * View that p2b can display.
+   */
+  play(stream) {
+    throw new Error('Abstract method. Must be implemented by subclasses');
+  }
+}
diff --git a/examples/pipetobrowser/browser/services/pipe-to-browser.js b/examples/pipetobrowser/browser/services/pipe-to-browser.js
new file mode 100644
index 0000000..7859f23
--- /dev/null
+++ b/examples/pipetobrowser/browser/services/pipe-to-browser.js
@@ -0,0 +1,81 @@
+/*
+ * Implements and publishes a Veyron service which accepts streaming RPC
+ * requests and delegates the stream back to the provided pipeRequestHandler.
+ * It also exposes the state of the service.
+ * @fileoverview
+ */
+
+import { Logger } from "libs/logs/logger"
+import { config } from 'config'
+
+var log = new Logger('services/p2b');
+var v = new Veyron(config.veyron);
+var server = v.newServer();
+
+// State of p2b service
+export var state = {
+  init() {
+    this.published = false;
+    this.publishing = false;
+    this.serviceEndpoint = null;
+  },
+  reset() {
+    state.init();
+  }
+};
+state.init();
+
+/*
+ * Publishes the p2b service under google/p2b/{name}
+ * e.g. If name is "JohnTablet", p2b service will be accessible under name:
+ * 'google/p2b/JohnTablet'
+ *
+ * pipe() method can be invoked on any 'google/p2b/{name}/suffix' name where
+ * suffix identifies the viewer that can format and display the stream data
+ * e.g. 'google/p2b/JohnTablet/DataTable'.pipe() will display the incoming
+ * data in a data table. See /app/viewer/ for a list of available viewers.
+ * @param {string} name Name to publish the service under
+ * @param {function} pipeRequestHandler A function that will be called when
+ * a request to handle a pipe stream comes in.
+ */
+export function publish(name, pipeRequestHandler) {
+  log.debug('publishing under name:', name);
+
+  /*
+   * Veyron pipe to browser service implementation.
+   * Implements the p2b IDL.
+   */
+  var p2b = {
+    pipe($suffix, $stream) {
+      return new Promise(function(resolve, reject) {
+        log.debug('received pipe request for:', $suffix);
+
+        $stream.on('end', () => {
+          log.debug('end of stream');
+          resolve('done');
+        });
+
+        $stream.on('error', (e) => {
+          log.debug('stream error', e);
+          reject(e);
+        });
+
+        pipeRequestHandler($suffix, $stream);
+      });
+    }
+  };
+
+  state.publishing = true;
+
+  return server.register(name, p2b).then(() => {
+    return server.publish(config.publishNamePrefix).then((endpoint) => {
+      log.debug('published with endpoint:', endpoint);
+
+      state.published = true;
+      state.publishing = false;
+      state.serviceEndpoint = endpoint;
+
+      return endpoint;
+    });
+  }).catch((err) => { state.reset(); return Promise.reject(err); });
+}
\ No newline at end of file
diff --git a/examples/pipetobrowser/browser/views/common/common.css b/examples/pipetobrowser/browser/views/common/common.css
new file mode 100644
index 0000000..f4d336f
--- /dev/null
+++ b/examples/pipetobrowser/browser/views/common/common.css
@@ -0,0 +1,3 @@
+.hidden {
+  display: none;
+}
diff --git a/examples/pipetobrowser/browser/views/error/component.html b/examples/pipetobrowser/browser/views/error/component.html
new file mode 100644
index 0000000..0aa6f19
--- /dev/null
+++ b/examples/pipetobrowser/browser/views/error/component.html
@@ -0,0 +1,14 @@
+<link rel="import" href="../../libs/vendor/polymer/polymer/polymer.html">
+
+<polymer-element name="p2b-error">
+  <template>
+    <h1>error: {{errorMessage}}</h1>
+  </template>
+  <script>
+    Polymer('p2b-error', {
+      ready: function() {
+      },
+      errorMessage: null
+    });
+    </script>
+</polymer-element>
\ No newline at end of file
diff --git a/examples/pipetobrowser/browser/views/error/view.js b/examples/pipetobrowser/browser/views/error/view.js
new file mode 100644
index 0000000..3b9024f
--- /dev/null
+++ b/examples/pipetobrowser/browser/views/error/view.js
@@ -0,0 +1,34 @@
+import { exists } from 'libs/utils/exists'
+import { View } from 'libs/mvc/view'
+
+/*
+ * View representing application error.
+ * @param {Error|String} err Error to display
+ * @class
+ * @extends {View}
+ */
+export class ErrorView extends View {
+	constructor(err) {
+		var el = document.createElement('p2b-error');
+		super(el);
+
+		this.error = err;
+	}
+
+	set error(err) {
+		if(!exists(err)) {
+			return;
+		}
+
+		var errorMessage = err.toString();
+		if(exists(err.stack)) {
+			errorMessage += err.stack;
+		}
+
+		this.element.errorMessage = errorMessage;
+	}
+
+	get error() {
+		return this.element.errorMessage;
+	}
+}
\ No newline at end of file
diff --git a/examples/pipetobrowser/browser/views/page/component.html b/examples/pipetobrowser/browser/views/page/component.html
new file mode 100644
index 0000000..6ee70d1
--- /dev/null
+++ b/examples/pipetobrowser/browser/views/page/component.html
@@ -0,0 +1,20 @@
+<link rel="import" href="../../libs/vendor/polymer/polymer/polymer.html">
+
+<polymer-element name="p2b-page">
+  <template>
+    <header role="banner">
+      <h1>Pipe To Browser</h1>
+    </header>
+    <section role="main" id="mainContainer"></section>
+  </template>
+  <script>
+    Polymer('p2b-page', {
+      ready: function() {
+      },
+      setMain: function(el) {
+        this.$.mainContainer.innerHTML = '';
+        this.$.mainContainer.appendChild(el);
+      }
+    });
+  </script>
+</polymer-element>
\ No newline at end of file
diff --git a/examples/pipetobrowser/browser/views/page/view.js b/examples/pipetobrowser/browser/views/page/view.js
new file mode 100644
index 0000000..69aae21
--- /dev/null
+++ b/examples/pipetobrowser/browser/views/page/view.js
@@ -0,0 +1,22 @@
+import { View } from 'libs/mvc/view'
+
+/*
+ * View representing the application page. Includes page level navigation, toolbar
+ * and other page chrome. Used as the container for all other views.
+ * @class
+ * @extends {View}
+ */
+export class PageView extends View {
+	constructor() {
+		var el = document.querySelector('p2b-page');
+		super(el);
+	}
+
+ /*
+  * Displays the given view inside the main area of the page
+  * @param {View} view View to display.
+  */
+	setMainView(view) {
+		this.element.setMain(view.element);
+	}
+}
\ No newline at end of file
diff --git a/examples/pipetobrowser/browser/views/pipe-viewer-placeholder/component.html b/examples/pipetobrowser/browser/views/pipe-viewer-placeholder/component.html
new file mode 100644
index 0000000..87d8b34
--- /dev/null
+++ b/examples/pipetobrowser/browser/views/pipe-viewer-placeholder/component.html
@@ -0,0 +1,22 @@
+<link rel="import" href="../../libs/vendor/polymer/polymer/polymer.html">
+
+<polymer-element name="p2b-pipe-viewer-placeholder">
+  <template>
+    <div>Viewer</div>
+    <div role="main" id="mainContainer"></div>
+  </template>
+  <script>
+    Polymer('p2b-pipe-viewer-placeholder', {
+      ready: function() {
+        this.showLoadingWidget();
+      },
+      showViewer: function(el) {
+        this.$.mainContainer.innerHTML = '';
+        this.$.mainContainer.appendChild(el);
+      },
+      showLoadingWidget: function() {
+        this.$.mainContainer.innerHTML = 'Loading...';
+      }
+    });
+  </script>
+</polymer-element>
\ No newline at end of file
diff --git a/examples/pipetobrowser/browser/views/pipe-viewer-placeholder/view.js b/examples/pipetobrowser/browser/views/pipe-viewer-placeholder/view.js
new file mode 100644
index 0000000..c65e1f2
--- /dev/null
+++ b/examples/pipetobrowser/browser/views/pipe-viewer-placeholder/view.js
@@ -0,0 +1,22 @@
+import { View } from 'libs/mvc/view'
+
+/*
+ * View representing a placeholder that will be filled with a pipe viewer element.
+ * Acts as the parent of pipe viewers and handles loading UI until actual viewer is ready.
+ * @class
+ * @extends {View}
+ */
+export class PipeViewerPlaceholderView extends View {
+  constructor() {
+    var el = document.createElement('p2b-pipe-viewer-placeholder');
+    super(el);
+  }
+
+ /*
+  * Displays the given view inside the placeholder
+  * @param {View} view View to display.
+  */
+  showViewer(view) {
+    this.element.showViewer(view.element);
+  }
+}
\ No newline at end of file
diff --git a/examples/pipetobrowser/browser/views/publish/component.html b/examples/pipetobrowser/browser/views/publish/component.html
new file mode 100644
index 0000000..4320cd1
--- /dev/null
+++ b/examples/pipetobrowser/browser/views/publish/component.html
@@ -0,0 +1,43 @@
+<link rel="import" href="../../libs/vendor/polymer/polymer/polymer.html">
+
+<polymer-element name="p2b-publish" attributes="publishState">
+
+  <template>
+    <link rel="stylesheet" href="../common/common.css">
+
+    <div>Status:</div>
+    <div>Published? {{ publishState.published }}</div>
+    <div>Publishing? {{ publishState.publishing }}</div>
+    <div>ServiceEndpoint? {{ publishState.serviceEndpoint }}</div>
+
+    <div class="{{ {hidden: publishState.published || publishState.publishing} | tokenList }}">
+      <input id="publishNameInput" value="p2bService">
+      <button on-click="{{ publishAction }}">Publish</button>
+    </div>
+
+    <div class="{{ {hidden : !publishState.published} | tokenList}}">
+      <h2>Waiting for incoming pipe request!</h2>
+    </div>
+
+  </template>
+  <script>
+    Polymer('p2b-publish', {
+      ready: function() {
+
+      },
+      /*
+       * Dynamic binding for the state of publishing p2b service.
+       * Any changes to this object will be reflected in the UI automatically
+       */
+      publishState: null,
+
+      /*
+       * Publish actions. Fires when user decided to publish the p2b service.
+       * user-entered name of the service will be provided as value of the event
+       */
+      publishAction: function() {
+        this.fire('publish', { publishName: this.$.publishNameInput.value });
+      }
+    });
+  </script>
+</polymer-element>
\ No newline at end of file
diff --git a/examples/pipetobrowser/browser/views/publish/view.js b/examples/pipetobrowser/browser/views/publish/view.js
new file mode 100644
index 0000000..3318d51
--- /dev/null
+++ b/examples/pipetobrowser/browser/views/publish/view.js
@@ -0,0 +1,25 @@
+import { View } from 'libs/mvc/view'
+
+/*
+ * View representing the state and interaction for publishing the p2b service.
+ * @class
+ * @extends {View}
+ */
+export class PublishView extends View {
+  constructor(publishState) {
+    var el = document.createElement('p2b-publish');
+    el.publishState = publishState;
+    super(el);
+  }
+
+/*
+ * Event representing user's intention to publish the p2b service under the provided name
+ * @event
+ * @type {string} Requested name for service to be published under
+ */
+  onPublishAction(eventHandler) {
+    this.element.addEventListener('publish', (e) => {
+      eventHandler(e.detail.publishName);
+    });
+  }
+}
diff --git a/examples/pipetobrowser/p2b.vdl b/examples/pipetobrowser/p2b.vdl
new file mode 100644
index 0000000..204127f
--- /dev/null
+++ b/examples/pipetobrowser/p2b.vdl
@@ -0,0 +1,7 @@
+package pipetobrowser
+
+// Viewer allows clients to stream data to it and to request a particular viewer to format and display the data.
+type Viewer interface {
+  // Pipe creates a bidirectional pipe between client and viewer service, returns a success message provided by the client
+  Pipe() stream<[]byte, _> (string, error)
+}
\ No newline at end of file
diff --git a/examples/pipetobrowser/p2b.vdl.go b/examples/pipetobrowser/p2b.vdl.go
new file mode 100644
index 0000000..b9bd36f
--- /dev/null
+++ b/examples/pipetobrowser/p2b.vdl.go
@@ -0,0 +1,244 @@
+// This file was auto-generated by the veyron vdl tool.
+// Source: p2b.vdl
+
+package pipetobrowser
+
+import (
+	// The non-user imports are prefixed with "_gen_" to prevent collisions.
+	_gen_veyron2 "veyron2"
+	_gen_ipc "veyron2/ipc"
+	_gen_naming "veyron2/naming"
+	_gen_rt "veyron2/rt"
+	_gen_vdl "veyron2/vdl"
+	_gen_wiretype "veyron2/wiretype"
+)
+
+// Viewer allows clients to stream data to it and to request a particular viewer to format and display the data.
+// Viewer is the interface the client binds and uses.
+// Viewer_ExcludingUniversal is the interface without internal framework-added methods
+// to enable embedding without method collisions.  Not to be used directly by clients.
+type Viewer_ExcludingUniversal interface {
+	// Pipe creates a bidirectional pipe between client and viewer service, returns a success message provided by the client
+	Pipe(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply ViewerPipeStream, err error)
+}
+type Viewer interface {
+	_gen_ipc.UniversalServiceMethods
+	Viewer_ExcludingUniversal
+}
+
+// ViewerService is the interface the server implements.
+type ViewerService interface {
+
+	// Pipe creates a bidirectional pipe between client and viewer service, returns a success message provided by the client
+	Pipe(context _gen_ipc.ServerContext, stream ViewerServicePipeStream) (reply string, err error)
+}
+
+// ViewerPipeStream is the interface for streaming responses of the method
+// Pipe in the service interface Viewer.
+type ViewerPipeStream interface {
+
+	// Send places the item onto the output stream, blocking if there is no buffer
+	// space available.
+	Send(item []byte) error
+
+	// CloseSend indicates to the server that no more items will be sent; server
+	// Recv calls will receive io.EOF after all sent items.  Subsequent calls to
+	// Send on the client will fail.  This is an optional call - it's used by
+	// streaming clients that need the server to receive the io.EOF terminator.
+	CloseSend() error
+
+	// Finish closes the stream and returns the positional return values for
+	// call.
+	Finish() (reply string, err error)
+
+	// Cancel cancels the RPC, notifying the server to stop processing.
+	Cancel()
+}
+
+// Implementation of the ViewerPipeStream interface that is not exported.
+type implViewerPipeStream struct {
+	clientCall _gen_ipc.Call
+}
+
+func (c *implViewerPipeStream) Send(item []byte) error {
+	return c.clientCall.Send(item)
+}
+
+func (c *implViewerPipeStream) CloseSend() error {
+	return c.clientCall.CloseSend()
+}
+
+func (c *implViewerPipeStream) Finish() (reply string, err error) {
+	if ierr := c.clientCall.Finish(&reply, &err); ierr != nil {
+		err = ierr
+	}
+	return
+}
+
+func (c *implViewerPipeStream) Cancel() {
+	c.clientCall.Cancel()
+}
+
+// ViewerServicePipeStream is the interface for streaming responses of the method
+// Pipe in the service interface Viewer.
+type ViewerServicePipeStream interface {
+
+	// Recv fills itemptr with the next item in the input stream, blocking until
+	// an item is available.  Returns io.EOF to indicate graceful end of input.
+	Recv() (item []byte, err error)
+}
+
+// Implementation of the ViewerServicePipeStream interface that is not exported.
+type implViewerServicePipeStream struct {
+	serverCall _gen_ipc.ServerCall
+}
+
+func (s *implViewerServicePipeStream) Recv() (item []byte, err error) {
+	err = s.serverCall.Recv(&item)
+	return
+}
+
+// BindViewer returns the client stub implementing the Viewer
+// interface.
+//
+// If no _gen_ipc.Client is specified, the default _gen_ipc.Client in the
+// global Runtime is used.
+func BindViewer(name string, opts ..._gen_ipc.BindOpt) (Viewer, error) {
+	var client _gen_ipc.Client
+	switch len(opts) {
+	case 0:
+		client = _gen_rt.R().Client()
+	case 1:
+		switch o := opts[0].(type) {
+		case _gen_veyron2.Runtime:
+			client = o.Client()
+		case _gen_ipc.Client:
+			client = o
+		default:
+			return nil, _gen_vdl.ErrUnrecognizedOption
+		}
+	default:
+		return nil, _gen_vdl.ErrTooManyOptionsToBind
+	}
+	stub := &clientStubViewer{client: client, name: name}
+
+	return stub, nil
+}
+
+// NewServerViewer creates a new server stub.
+//
+// It takes a regular server implementing the ViewerService
+// interface, and returns a new server stub.
+func NewServerViewer(server ViewerService) interface{} {
+	return &ServerStubViewer{
+		service: server,
+	}
+}
+
+// clientStubViewer implements Viewer.
+type clientStubViewer struct {
+	client _gen_ipc.Client
+	name   string
+}
+
+func (__gen_c *clientStubViewer) Pipe(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply ViewerPipeStream, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "Pipe", nil, opts...); err != nil {
+		return
+	}
+	reply = &implViewerPipeStream{clientCall: call}
+	return
+}
+
+func (__gen_c *clientStubViewer) UnresolveStep(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply []string, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "UnresolveStep", nil, opts...); err != nil {
+		return
+	}
+	if ierr := call.Finish(&reply, &err); ierr != nil {
+		err = ierr
+	}
+	return
+}
+
+func (__gen_c *clientStubViewer) Signature(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply _gen_ipc.ServiceSignature, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "Signature", nil, opts...); err != nil {
+		return
+	}
+	if ierr := call.Finish(&reply, &err); ierr != nil {
+		err = ierr
+	}
+	return
+}
+
+func (__gen_c *clientStubViewer) GetMethodTags(ctx _gen_ipc.Context, method string, opts ..._gen_ipc.CallOpt) (reply []interface{}, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "GetMethodTags", []interface{}{method}, opts...); err != nil {
+		return
+	}
+	if ierr := call.Finish(&reply, &err); ierr != nil {
+		err = ierr
+	}
+	return
+}
+
+// ServerStubViewer wraps a server that implements
+// ViewerService and provides an object that satisfies
+// the requirements of veyron2/ipc.ReflectInvoker.
+type ServerStubViewer struct {
+	service ViewerService
+}
+
+func (__gen_s *ServerStubViewer) GetMethodTags(call _gen_ipc.ServerCall, method string) ([]interface{}, error) {
+	// TODO(bprosnitz) GetMethodTags() will be replaces with Signature().
+	// Note: This exhibits some weird behavior like returning a nil error if the method isn't found.
+	// This will change when it is replaced with Signature().
+	switch method {
+	case "Pipe":
+		return []interface{}{}, nil
+	default:
+		return nil, nil
+	}
+}
+
+func (__gen_s *ServerStubViewer) Signature(call _gen_ipc.ServerCall) (_gen_ipc.ServiceSignature, error) {
+	result := _gen_ipc.ServiceSignature{Methods: make(map[string]_gen_ipc.MethodSignature)}
+	result.Methods["Pipe"] = _gen_ipc.MethodSignature{
+		InArgs: []_gen_ipc.MethodArgument{},
+		OutArgs: []_gen_ipc.MethodArgument{
+			{Name: "", Type: 3},
+			{Name: "", Type: 65},
+		},
+		InStream: 67,
+	}
+
+	result.TypeDefs = []_gen_vdl.Any{
+		_gen_wiretype.NamedPrimitiveType{Type: 0x1, Name: "error", Tags: []string(nil)}, _gen_wiretype.NamedPrimitiveType{Type: 0x32, Name: "byte", Tags: []string(nil)}, _gen_wiretype.SliceType{Elem: 0x42, Name: "", Tags: []string(nil)}}
+
+	return result, nil
+}
+
+func (__gen_s *ServerStubViewer) UnresolveStep(call _gen_ipc.ServerCall) (reply []string, err error) {
+	if unresolver, ok := __gen_s.service.(_gen_ipc.Unresolver); ok {
+		return unresolver.UnresolveStep(call)
+	}
+	if call.Server() == nil {
+		return
+	}
+	var published []string
+	if published, err = call.Server().Published(); err != nil || published == nil {
+		return
+	}
+	reply = make([]string, len(published))
+	for i, p := range published {
+		reply[i] = _gen_naming.Join(p, call.Name())
+	}
+	return
+}
+
+func (__gen_s *ServerStubViewer) Pipe(call _gen_ipc.ServerCall) (reply string, err error) {
+	stream := &implViewerServicePipeStream{serverCall: call}
+	reply, err = __gen_s.service.Pipe(call, stream)
+	return
+}
diff --git a/examples/pipetobrowser/p2b/main.go b/examples/pipetobrowser/p2b/main.go
new file mode 100644
index 0000000..d94bb05
--- /dev/null
+++ b/examples/pipetobrowser/p2b/main.go
@@ -0,0 +1,85 @@
+// Pipe To Browser client.
+// This executable pipes its sdtin to p2b service running in the browser
+package main
+
+import (
+	"bufio"
+	"flag"
+	"fmt"
+	"os"
+
+	"veyron2/rt"
+
+	"veyron/examples/pipetobrowser"
+)
+
+const usage = `
+%s is a Pipe To Browser client. It allows allows
+one to pipe anything from console to the browser Data being piped to
+the browser then is displayed in a graphical and formatted way by a "viewer".
+
+Usage:
+
+  %s [<name>/<viewer>]
+
+  For example:
+
+	ls -l | p2b pipetobrowser/jane/DataTable
+
+  where <name> (pipetobrowser/jane) is the veyron name where p2b
+  service is running in the browser. <viewer> (DataTable) specifies what
+  viewer should be used to display the data.
+
+`
+
+func Usage() {
+	fmt.Fprintf(os.Stderr, usage, os.Args[0], os.Args[0])
+}
+
+func main() {
+	flag.Usage = Usage
+	runtime := rt.Init()
+	log := runtime.Logger()
+
+	if flag.NArg() != 1 {
+		Usage()
+		return
+	}
+
+	name := flag.Arg(0)
+
+	// bind to the p2b service
+	s, err := pipetobrowser.BindViewer(name)
+	if err != nil {
+		log.Errorf("error binding to server: %v", err)
+		return
+	}
+
+	stream, err := s.Pipe(runtime.NewContext())
+	if err != nil {
+		log.Errorf("failed to pipe to '%s' please ensure p2b service is running in the browser and name is correct.\nERR:%v", name, err)
+		return
+	}
+
+	scanner := bufio.NewScanner(os.Stdin)
+	scanner.Split(bufio.ScanRunes)
+	log.Info("Waiting for input")
+	for scanner.Scan() {
+		bytes := scanner.Bytes()
+
+		if err := stream.Send(bytes); err != nil {
+			log.Errorf("error while sending: %v", err)
+			return
+		}
+	}
+	stream.CloseSend()
+	result, err := stream.Finish()
+	if err != nil {
+		log.Errorf("error finishing stream: %v", err)
+		return
+	}
+
+	log.Infof("Stream finished with status: %v", result)
+
+	fmt.Println("Finished piping to browser! Thanks for using p2b.")
+}
diff --git a/examples/rockpaperscissors/impl/impl.go b/examples/rockpaperscissors/impl/impl.go
index 260e9ca..c16d0aa 100644
--- a/examples/rockpaperscissors/impl/impl.go
+++ b/examples/rockpaperscissors/impl/impl.go
@@ -33,7 +33,7 @@
 	return r.scoreKeeper
 }
 
-func (r *RPS) CreateGame(ctx ipc.Context, opts rps.GameOptions) (rps.GameID, error) {
+func (r *RPS) CreateGame(ctx ipc.ServerContext, opts rps.GameOptions) (rps.GameID, error) {
 	vlog.VI(1).Infof("CreateGame %+v from %s", opts, ctx.RemoteID())
 	names := ctx.LocalID().Names()
 	if len(names) == 0 {
@@ -42,7 +42,7 @@
 	return r.judge.createGame(names[0], opts)
 }
 
-func (r *RPS) Play(ctx ipc.Context, id rps.GameID, stream rps.JudgeServicePlayStream) (rps.PlayResult, error) {
+func (r *RPS) Play(ctx ipc.ServerContext, id rps.GameID, stream rps.JudgeServicePlayStream) (rps.PlayResult, error) {
 	vlog.VI(1).Infof("Play %+v from %s", id, ctx.RemoteID())
 	names := ctx.RemoteID().Names()
 	if len(names) == 0 {
@@ -51,12 +51,12 @@
 	return r.judge.play(names[0], id, stream)
 }
 
-func (r *RPS) Challenge(ctx ipc.Context, address string, id rps.GameID) (bool, error) {
+func (r *RPS) Challenge(ctx ipc.ServerContext, address string, id rps.GameID) error {
 	vlog.VI(1).Infof("Challenge (%q, %+v) from %s", address, id, ctx.RemoteID())
 	return r.player.challenge(address, id)
 }
 
-func (r *RPS) Record(ctx ipc.Context, score rps.ScoreCard) error {
+func (r *RPS) Record(ctx ipc.ServerContext, score rps.ScoreCard) error {
 	vlog.VI(1).Infof("Record (%+v) from %s", score, ctx.RemoteID())
 	return r.scoreKeeper.Record(ctx, score)
 }
diff --git a/examples/rockpaperscissors/impl/impl_test.go b/examples/rockpaperscissors/impl/impl_test.go
index 63c67f5..883b6f8 100644
--- a/examples/rockpaperscissors/impl/impl_test.go
+++ b/examples/rockpaperscissors/impl/impl_test.go
@@ -16,7 +16,7 @@
 )
 
 func startMountTable(t *testing.T, runtime veyron2.Runtime) (string, func()) {
-	server, err := runtime.NewServer()
+	server, err := runtime.NewServer(veyron2.ServesMountTableOpt(true))
 	if err != nil {
 		t.Fatalf("NewServer() failed: %v", err)
 	}
diff --git a/examples/rockpaperscissors/impl/judge.go b/examples/rockpaperscissors/impl/judge.go
index 02ac79d..75c2b59 100644
--- a/examples/rockpaperscissors/impl/judge.go
+++ b/examples/rockpaperscissors/impl/judge.go
@@ -11,6 +11,7 @@
 	"veyron/examples/rockpaperscissors/common"
 
 	"veyron2/naming"
+	"veyron2/rt"
 	"veyron2/vlog"
 )
 
@@ -292,7 +293,7 @@
 		vlog.Infof("BindRockPaperScissors: %v", err)
 		return err
 	}
-	err = k.Record(score)
+	err = k.Record(rt.R().TODOContext(), score)
 	if err != nil {
 		vlog.Infof("Record: %v", err)
 		return err
diff --git a/examples/rockpaperscissors/impl/player.go b/examples/rockpaperscissors/impl/player.go
index 7181304..fa7ee3a 100644
--- a/examples/rockpaperscissors/impl/player.go
+++ b/examples/rockpaperscissors/impl/player.go
@@ -1,7 +1,6 @@
 package impl
 
 import (
-	"errors"
 	"io"
 	"math/rand"
 	"sync"
@@ -12,6 +11,7 @@
 
 	"veyron2"
 	"veyron2/naming"
+	"veyron2/rt"
 	"veyron2/vlog"
 )
 
@@ -51,14 +51,10 @@
 		return err
 	}
 	vlog.Infof("chosen opponent is %q", opponent)
-	accepted, err := p.sendChallenge(opponent, judge, gameID)
-	if err != nil {
+	if err = p.sendChallenge(opponent, judge, gameID); err != nil {
 		vlog.Infof("sendChallenge: %v", err)
 		return err
 	}
-	if !accepted {
-		return errors.New("challenge declined")
-	}
 	result, err := p.playGame(judge, gameID)
 	if err != nil {
 		vlog.Infof("playGame: %v", err)
@@ -82,22 +78,22 @@
 	if rand.Intn(2) == 1 {
 		gameType = rps.LizardSpock
 	}
-	return j.CreateGame(rps.GameOptions{NumRounds: int32(numRounds), GameType: gameType})
+	return j.CreateGame(rt.R().TODOContext(), rps.GameOptions{NumRounds: int32(numRounds), GameType: gameType})
 }
 
-func (p *Player) sendChallenge(opponent, judge string, gameID rps.GameID) (bool, error) {
+func (p *Player) sendChallenge(opponent, judge string, gameID rps.GameID) error {
 	o, err := rps.BindRockPaperScissors(opponent)
 	if err != nil {
-		return false, err
+		return err
 	}
-	return o.Challenge(judge, gameID)
+	return o.Challenge(rt.R().TODOContext(), judge, gameID)
 }
 
 // challenge receives an incoming challenge.
-func (p *Player) challenge(judge string, gameID rps.GameID) (bool, error) {
+func (p *Player) challenge(judge string, gameID rps.GameID) error {
 	vlog.Infof("challenge received: %s %v", judge, gameID)
 	go p.playGame(judge, gameID)
-	return true, nil
+	return nil
 }
 
 // playGame plays an entire game, which really only consists of reading
@@ -107,7 +103,7 @@
 	if err != nil {
 		return rps.PlayResult{}, err
 	}
-	game, err := j.Play(gameID, veyron2.CallTimeout(10*time.Minute))
+	game, err := j.Play(rt.R().TODOContext(), gameID, veyron2.CallTimeout(10*time.Minute))
 	if err != nil {
 		return rps.PlayResult{}, err
 	}
diff --git a/examples/rockpaperscissors/impl/scorekeeper.go b/examples/rockpaperscissors/impl/scorekeeper.go
index e98cc31..91525ae 100644
--- a/examples/rockpaperscissors/impl/scorekeeper.go
+++ b/examples/rockpaperscissors/impl/scorekeeper.go
@@ -20,7 +20,7 @@
 	return k.numRecords.Value()
 }
 
-func (k *ScoreKeeper) Record(ctx ipc.Context, score rps.ScoreCard) error {
+func (k *ScoreKeeper) Record(ctx ipc.ServerContext, score rps.ScoreCard) error {
 	vlog.Infof("Received ScoreCard from %s:", ctx.RemoteID())
 	vlog.Info(common.FormatScoreCard(score))
 	k.numRecords.Add(1)
diff --git a/examples/rockpaperscissors/rpsscorekeeper/main.go b/examples/rockpaperscissors/rpsscorekeeper/main.go
index 38ca2a7..54a7425 100644
--- a/examples/rockpaperscissors/rpsscorekeeper/main.go
+++ b/examples/rockpaperscissors/rpsscorekeeper/main.go
@@ -27,7 +27,7 @@
 	ch chan rps.ScoreCard
 }
 
-func (i *impl) Record(ctx ipc.Context, score rps.ScoreCard) error {
+func (i *impl) Record(ctx ipc.ServerContext, score rps.ScoreCard) error {
 	vlog.VI(1).Infof("Record (%+v) from %s", score, ctx.RemoteID())
 	i.ch <- score
 	return nil
diff --git a/examples/rockpaperscissors/service.vdl b/examples/rockpaperscissors/service.vdl
index 91a8347..4af66e9 100644
--- a/examples/rockpaperscissors/service.vdl
+++ b/examples/rockpaperscissors/service.vdl
@@ -81,8 +81,8 @@
 // Player can receive challenges from other players.
 type Player interface {
   // Challenge is used by other players to challenge this player to a game. If
-  // the challenge is accepted, the method returns true.
-  Challenge(Address string, ID GameID) (bool, error)
+  // the challenge is accepted, the method returns nil.
+  Challenge(Address string, ID GameID) error
 }
 
 // ScoreKeeper receives the outcome of games from Judges.
diff --git a/examples/rockpaperscissors/service.vdl.go b/examples/rockpaperscissors/service.vdl.go
index cdf2198..3b2c8cd 100644
--- a/examples/rockpaperscissors/service.vdl.go
+++ b/examples/rockpaperscissors/service.vdl.go
@@ -84,9 +84,9 @@
 type Judge_ExcludingUniversal interface {
 	// CreateGame creates a new game with the given game options and returns a game
 	// identifier that can be used by the players to join the game.
-	CreateGame(Opts GameOptions, opts ..._gen_ipc.ClientCallOpt) (reply GameID, err error)
+	CreateGame(ctx _gen_ipc.Context, Opts GameOptions, opts ..._gen_ipc.CallOpt) (reply GameID, err error)
 	// Play lets a player join an existing game and play.
-	Play(ID GameID, opts ..._gen_ipc.ClientCallOpt) (reply JudgePlayStream, err error)
+	Play(ctx _gen_ipc.Context, ID GameID, opts ..._gen_ipc.CallOpt) (reply JudgePlayStream, err error)
 }
 type Judge interface {
 	_gen_ipc.UniversalServiceMethods
@@ -98,9 +98,9 @@
 
 	// CreateGame creates a new game with the given game options and returns a game
 	// identifier that can be used by the players to join the game.
-	CreateGame(context _gen_ipc.Context, Opts GameOptions) (reply GameID, err error)
+	CreateGame(context _gen_ipc.ServerContext, Opts GameOptions) (reply GameID, err error)
 	// Play lets a player join an existing game and play.
-	Play(context _gen_ipc.Context, ID GameID, stream JudgeServicePlayStream) (reply PlayResult, err error)
+	Play(context _gen_ipc.ServerContext, ID GameID, stream JudgeServicePlayStream) (reply PlayResult, err error)
 }
 
 // JudgePlayStream is the interface for streaming responses of the method
@@ -131,7 +131,7 @@
 
 // Implementation of the JudgePlayStream interface that is not exported.
 type implJudgePlayStream struct {
-	clientCall _gen_ipc.ClientCall
+	clientCall _gen_ipc.Call
 }
 
 func (c *implJudgePlayStream) Send(item PlayerAction) error {
@@ -227,9 +227,9 @@
 	name   string
 }
 
-func (__gen_c *clientStubJudge) CreateGame(Opts GameOptions, opts ..._gen_ipc.ClientCallOpt) (reply GameID, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "CreateGame", []interface{}{Opts}, opts...); err != nil {
+func (__gen_c *clientStubJudge) CreateGame(ctx _gen_ipc.Context, Opts GameOptions, opts ..._gen_ipc.CallOpt) (reply GameID, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "CreateGame", []interface{}{Opts}, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -238,18 +238,18 @@
 	return
 }
 
-func (__gen_c *clientStubJudge) Play(ID GameID, opts ..._gen_ipc.ClientCallOpt) (reply JudgePlayStream, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "Play", []interface{}{ID}, opts...); err != nil {
+func (__gen_c *clientStubJudge) Play(ctx _gen_ipc.Context, ID GameID, opts ..._gen_ipc.CallOpt) (reply JudgePlayStream, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "Play", []interface{}{ID}, opts...); err != nil {
 		return
 	}
 	reply = &implJudgePlayStream{clientCall: call}
 	return
 }
 
-func (__gen_c *clientStubJudge) UnresolveStep(opts ..._gen_ipc.ClientCallOpt) (reply []string, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "UnresolveStep", nil, opts...); err != nil {
+func (__gen_c *clientStubJudge) UnresolveStep(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply []string, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "UnresolveStep", nil, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -258,9 +258,9 @@
 	return
 }
 
-func (__gen_c *clientStubJudge) Signature(opts ..._gen_ipc.ClientCallOpt) (reply _gen_ipc.ServiceSignature, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "Signature", nil, opts...); err != nil {
+func (__gen_c *clientStubJudge) Signature(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply _gen_ipc.ServiceSignature, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "Signature", nil, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -269,9 +269,9 @@
 	return
 }
 
-func (__gen_c *clientStubJudge) GetMethodTags(method string, opts ..._gen_ipc.ClientCallOpt) (reply []interface{}, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "GetMethodTags", []interface{}{method}, opts...); err != nil {
+func (__gen_c *clientStubJudge) GetMethodTags(ctx _gen_ipc.Context, method string, opts ..._gen_ipc.CallOpt) (reply []interface{}, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "GetMethodTags", []interface{}{method}, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -415,8 +415,8 @@
 // to enable embedding without method collisions.  Not to be used directly by clients.
 type Player_ExcludingUniversal interface {
 	// Challenge is used by other players to challenge this player to a game. If
-	// the challenge is accepted, the method returns true.
-	Challenge(Address string, ID GameID, opts ..._gen_ipc.ClientCallOpt) (reply bool, err error)
+	// the challenge is accepted, the method returns nil.
+	Challenge(ctx _gen_ipc.Context, Address string, ID GameID, opts ..._gen_ipc.CallOpt) (err error)
 }
 type Player interface {
 	_gen_ipc.UniversalServiceMethods
@@ -427,8 +427,8 @@
 type PlayerService interface {
 
 	// Challenge is used by other players to challenge this player to a game. If
-	// the challenge is accepted, the method returns true.
-	Challenge(context _gen_ipc.Context, Address string, ID GameID) (reply bool, err error)
+	// the challenge is accepted, the method returns nil.
+	Challenge(context _gen_ipc.ServerContext, Address string, ID GameID) (err error)
 }
 
 // BindPlayer returns the client stub implementing the Player
@@ -474,9 +474,20 @@
 	name   string
 }
 
-func (__gen_c *clientStubPlayer) Challenge(Address string, ID GameID, opts ..._gen_ipc.ClientCallOpt) (reply bool, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "Challenge", []interface{}{Address, ID}, opts...); err != nil {
+func (__gen_c *clientStubPlayer) Challenge(ctx _gen_ipc.Context, Address string, ID GameID, opts ..._gen_ipc.CallOpt) (err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "Challenge", []interface{}{Address, ID}, opts...); err != nil {
+		return
+	}
+	if ierr := call.Finish(&err); ierr != nil {
+		err = ierr
+	}
+	return
+}
+
+func (__gen_c *clientStubPlayer) UnresolveStep(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply []string, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "UnresolveStep", nil, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -485,9 +496,9 @@
 	return
 }
 
-func (__gen_c *clientStubPlayer) UnresolveStep(opts ..._gen_ipc.ClientCallOpt) (reply []string, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "UnresolveStep", nil, opts...); err != nil {
+func (__gen_c *clientStubPlayer) Signature(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply _gen_ipc.ServiceSignature, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "Signature", nil, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -496,20 +507,9 @@
 	return
 }
 
-func (__gen_c *clientStubPlayer) Signature(opts ..._gen_ipc.ClientCallOpt) (reply _gen_ipc.ServiceSignature, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "Signature", nil, opts...); err != nil {
-		return
-	}
-	if ierr := call.Finish(&reply, &err); ierr != nil {
-		err = ierr
-	}
-	return
-}
-
-func (__gen_c *clientStubPlayer) GetMethodTags(method string, opts ..._gen_ipc.ClientCallOpt) (reply []interface{}, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "GetMethodTags", []interface{}{method}, opts...); err != nil {
+func (__gen_c *clientStubPlayer) GetMethodTags(ctx _gen_ipc.Context, method string, opts ..._gen_ipc.CallOpt) (reply []interface{}, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "GetMethodTags", []interface{}{method}, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -545,7 +545,6 @@
 			{Name: "ID", Type: 65},
 		},
 		OutArgs: []_gen_ipc.MethodArgument{
-			{Name: "", Type: 2},
 			{Name: "", Type: 66},
 		},
 	}
@@ -579,8 +578,8 @@
 	return
 }
 
-func (__gen_s *ServerStubPlayer) Challenge(call _gen_ipc.ServerCall, Address string, ID GameID) (reply bool, err error) {
-	reply, err = __gen_s.service.Challenge(call, Address, ID)
+func (__gen_s *ServerStubPlayer) Challenge(call _gen_ipc.ServerCall, Address string, ID GameID) (err error) {
+	err = __gen_s.service.Challenge(call, Address, ID)
 	return
 }
 
@@ -589,7 +588,7 @@
 // ScoreKeeper_ExcludingUniversal is the interface without internal framework-added methods
 // to enable embedding without method collisions.  Not to be used directly by clients.
 type ScoreKeeper_ExcludingUniversal interface {
-	Record(Score ScoreCard, opts ..._gen_ipc.ClientCallOpt) (err error)
+	Record(ctx _gen_ipc.Context, Score ScoreCard, opts ..._gen_ipc.CallOpt) (err error)
 }
 type ScoreKeeper interface {
 	_gen_ipc.UniversalServiceMethods
@@ -598,7 +597,7 @@
 
 // ScoreKeeperService is the interface the server implements.
 type ScoreKeeperService interface {
-	Record(context _gen_ipc.Context, Score ScoreCard) (err error)
+	Record(context _gen_ipc.ServerContext, Score ScoreCard) (err error)
 }
 
 // BindScoreKeeper returns the client stub implementing the ScoreKeeper
@@ -644,9 +643,9 @@
 	name   string
 }
 
-func (__gen_c *clientStubScoreKeeper) Record(Score ScoreCard, opts ..._gen_ipc.ClientCallOpt) (err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "Record", []interface{}{Score}, opts...); err != nil {
+func (__gen_c *clientStubScoreKeeper) Record(ctx _gen_ipc.Context, Score ScoreCard, opts ..._gen_ipc.CallOpt) (err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "Record", []interface{}{Score}, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&err); ierr != nil {
@@ -655,9 +654,9 @@
 	return
 }
 
-func (__gen_c *clientStubScoreKeeper) UnresolveStep(opts ..._gen_ipc.ClientCallOpt) (reply []string, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "UnresolveStep", nil, opts...); err != nil {
+func (__gen_c *clientStubScoreKeeper) UnresolveStep(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply []string, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "UnresolveStep", nil, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -666,9 +665,9 @@
 	return
 }
 
-func (__gen_c *clientStubScoreKeeper) Signature(opts ..._gen_ipc.ClientCallOpt) (reply _gen_ipc.ServiceSignature, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "Signature", nil, opts...); err != nil {
+func (__gen_c *clientStubScoreKeeper) Signature(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply _gen_ipc.ServiceSignature, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "Signature", nil, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -677,9 +676,9 @@
 	return
 }
 
-func (__gen_c *clientStubScoreKeeper) GetMethodTags(method string, opts ..._gen_ipc.ClientCallOpt) (reply []interface{}, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "GetMethodTags", []interface{}{method}, opts...); err != nil {
+func (__gen_c *clientStubScoreKeeper) GetMethodTags(ctx _gen_ipc.Context, method string, opts ..._gen_ipc.CallOpt) (reply []interface{}, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "GetMethodTags", []interface{}{method}, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -849,9 +848,9 @@
 	name   string
 }
 
-func (__gen_c *clientStubRockPaperScissors) UnresolveStep(opts ..._gen_ipc.ClientCallOpt) (reply []string, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "UnresolveStep", nil, opts...); err != nil {
+func (__gen_c *clientStubRockPaperScissors) UnresolveStep(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply []string, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "UnresolveStep", nil, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -860,9 +859,9 @@
 	return
 }
 
-func (__gen_c *clientStubRockPaperScissors) Signature(opts ..._gen_ipc.ClientCallOpt) (reply _gen_ipc.ServiceSignature, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "Signature", nil, opts...); err != nil {
+func (__gen_c *clientStubRockPaperScissors) Signature(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply _gen_ipc.ServiceSignature, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "Signature", nil, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -871,9 +870,9 @@
 	return
 }
 
-func (__gen_c *clientStubRockPaperScissors) GetMethodTags(method string, opts ..._gen_ipc.ClientCallOpt) (reply []interface{}, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "GetMethodTags", []interface{}{method}, opts...); err != nil {
+func (__gen_c *clientStubRockPaperScissors) GetMethodTags(ctx _gen_ipc.Context, method string, opts ..._gen_ipc.CallOpt) (reply []interface{}, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "GetMethodTags", []interface{}{method}, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
diff --git a/examples/storage/mdb/mdb_init/main.go b/examples/storage/mdb/mdb_init/main.go
index 15b2066..4cc4a83 100644
--- a/examples/storage/mdb/mdb_init/main.go
+++ b/examples/storage/mdb/mdb_init/main.go
@@ -148,7 +148,7 @@
 func (st *state) put(path string, v interface{}) {
 	vlog.Infof("Storing %q = %+v", path, v)
 	st.makeParentDirs(path)
-	if _, err := st.store.Bind(path).Put(st.transaction, v); err != nil {
+	if _, err := st.store.Bind(path).Put(rt.R().TODOContext(), st.transaction, v); err != nil {
 		vlog.Infof("put failed: %s: %s", path, err)
 		return
 	}
@@ -159,7 +159,7 @@
 func (st *state) putNamed(name, path string, v interface{}) {
 	vlog.Infof("Storing %s: %q = %+v", name, path, v)
 	st.makeParentDirs(path)
-	s, err := st.store.Bind(path).Put(st.transaction, v)
+	s, err := st.store.Bind(path).Put(rt.R().TODOContext(), st.transaction, v)
 	if err != nil {
 		vlog.Infof("Put failed: %s: %s", path, err)
 		return
@@ -174,10 +174,10 @@
 	for i, _ := range l {
 		prefix := filepath.Join(l[:i]...)
 		o := st.store.Bind(prefix)
-		if exist, err := o.Exists(st.transaction); err != nil {
+		if exist, err := o.Exists(rt.R().TODOContext(), st.transaction); err != nil {
 			vlog.Infof("Error checking existence at %q: %s", prefix, err)
 		} else if !exist {
-			if _, err := o.Put(st.transaction, &schema.Dir{}); err != nil {
+			if _, err := o.Put(rt.R().TODOContext(), st.transaction, &schema.Dir{}); err != nil {
 				vlog.Infof("Error creating parent %q: %s", prefix, err)
 			}
 		}
@@ -186,12 +186,12 @@
 
 // newTransaction starts a new transaction.
 func (st *state) newTransaction() {
-	st.transaction = primitives.NewTransaction()
+	st.transaction = primitives.NewTransaction(rt.R().TODOContext())
 }
 
 // commit commits the current transaction.
 func (st *state) commit() {
-	if err := st.transaction.Commit(); err != nil {
+	if err := st.transaction.Commit(rt.R().TODOContext()); err != nil {
 		vlog.Infof("Failed to commit transaction: %s", err)
 	}
 	st.transaction = nil
diff --git a/examples/storage/viewer/value.go b/examples/storage/viewer/value.go
index 7bb2dfc..fc1d450 100644
--- a/examples/storage/viewer/value.go
+++ b/examples/storage/viewer/value.go
@@ -5,6 +5,7 @@
 	"sort"
 	"time"
 
+	"veyron2/rt"
 	"veyron2/storage"
 )
 
@@ -20,7 +21,7 @@
 
 // glob performs a glob expansion of the pattern.  The results are sorted.
 func glob(st storage.Store, path, pattern string) ([]string, error) {
-	results, err := st.Bind(path).GlobT(nil, pattern)
+	results, err := st.Bind(path).GlobT(rt.R().TODOContext(), nil, pattern)
 	if err != nil {
 		return nil, err
 	}
@@ -70,7 +71,7 @@
 // exist.
 func (v *Value) Get(path string) interface{} {
 	path = v.fullpath(path)
-	e, err := v.store.Bind(path).Get(nil)
+	e, err := v.store.Bind(path).Get(rt.R().TODOContext(), nil)
 	if err != nil {
 		return nil
 	}
diff --git a/examples/storage/viewer/viewer.go b/examples/storage/viewer/viewer.go
index 9237b90..b97d499 100644
--- a/examples/storage/viewer/viewer.go
+++ b/examples/storage/viewer/viewer.go
@@ -24,6 +24,7 @@
 	"net/http"
 	"path/filepath"
 
+	"veyron2/rt"
 	"veyron2/storage"
 	"veyron2/vlog"
 )
@@ -72,7 +73,7 @@
 // is based on the type of the value, under /template/<pkgPath>/<typeName>.
 func (s *server) loadTemplate(v interface{}) *template.Template {
 	path := templatePath(v)
-	e, err := s.store.Bind(path).Get(nil)
+	e, err := s.store.Bind(path).Get(rt.R().TODOContext(), nil)
 	if err != nil {
 		return nil
 	}
@@ -124,7 +125,7 @@
 // ServeHTTP is the main HTTP handler.
 func (s *server) ServeHTTP(w http.ResponseWriter, req *http.Request) {
 	path := req.URL.Path
-	e, err := s.store.Bind(path).Get(nil)
+	e, err := s.store.Bind(path).Get(rt.R().TODOContext(), nil)
 	if err != nil {
 		msg := fmt.Sprintf("<html><body><h1>%s</h1><h2>Error: %s</h2></body></html>",
 			html.EscapeString(path),
diff --git a/examples/todos/test/store_test.go b/examples/todos/test/store_test.go
index 1131530..f1736cf 100644
--- a/examples/todos/test/store_test.go
+++ b/examples/todos/test/store_test.go
@@ -20,6 +20,7 @@
 
 	bb "veyron/lib/testutil/blackbox"
 
+	"veyron2/rt"
 	"veyron2/storage"
 	"veyron2/storage/vstore/primitives"
 	"veyron2/vom"
@@ -118,10 +119,11 @@
 // Test cases
 
 func testTodos(t *testing.T, st storage.Store) {
+	ctx := rt.R().NewContext()
 	// Create lists.
 	{
 		// NOTE(sadovsky): Currently, we can't put /x/y until we put / and /x.
-		tr := primitives.NewTransaction()
+		tr := primitives.NewTransaction(ctx)
 		put(t, st, tr, "/", newDir())
 		put(t, st, tr, "/lists", newDir())
 		put(t, st, tr, "/lists/drinks", newList())
@@ -131,7 +133,7 @@
 
 	// Add some todos.
 	{
-		tr := primitives.NewTransaction()
+		tr := primitives.NewTransaction(ctx)
 		// NOTE(sadovsky): It feels awkward to create my own names (ids) for these
 		// Todo objects. I'd like some way to create them in some "directory"
 		// without explicitly naming them. I.e. in this case I want to think of the
@@ -144,7 +146,7 @@
 
 	// Verify some of the photos.
 	{
-		tr := primitives.NewTransaction()
+		tr := primitives.NewTransaction(ctx)
 		todo := getTodo(t, st, tr, "/lists/drinks/Todos/0")
 		if todo.Text != "milk" {
 			t.Errorf("Expected %q, got %q", "milk", todo.Text)
@@ -152,7 +154,7 @@
 	}
 
 	{
-		tr := primitives.NewTransaction()
+		tr := primitives.NewTransaction(ctx)
 		todo := getTodo(t, st, tr, "/lists/snacks/Todos/0")
 		if todo.Text != "chips" {
 			t.Errorf("Expected %q, got %q", "chips", todo.Text)
@@ -161,7 +163,7 @@
 
 	// Move a todo item from one list to another.
 	{
-		tr := primitives.NewTransaction()
+		tr := primitives.NewTransaction(ctx)
 		todo := getTodo(t, st, tr, "/lists/drinks/Todos/1")
 		// NOTE(sadovsky): Remove works for map entries, but not yet for slices.
 		// Instead, we read the list, prune it, and write it back.
@@ -176,11 +178,11 @@
 	// Verify that the original todo is no longer there.
 	// TODO(sadovsky): Use queries to verify that both lists have changed.
 	{
-		tr := primitives.NewTransaction()
+		tr := primitives.NewTransaction(ctx)
 		// Note, this will be much prettier in veyron2.
 		_, file, line, _ := runtime.Caller(1)
 		path := "/lists/drinks/1"
-		if _, err := st.Bind(path).Get(tr); err == nil {
+		if _, err := st.Bind(path).Get(ctx, tr); err == nil {
 			t.Fatalf("%s(%d): got removed object %s", file, line, path)
 		}
 	}
diff --git a/examples/todos/test/store_util.go b/examples/todos/test/store_util.go
index 503ea73..aff92b3 100644
--- a/examples/todos/test/store_util.go
+++ b/examples/todos/test/store_util.go
@@ -4,12 +4,13 @@
 	"runtime"
 	"testing"
 
+	"veyron2/rt"
 	"veyron2/storage"
 )
 
 func get(t *testing.T, st storage.Store, tr storage.Transaction, path string) interface{} {
 	_, file, line, _ := runtime.Caller(1)
-	e, err := st.Bind(path).Get(tr)
+	e, err := st.Bind(path).Get(rt.R().NewContext(), tr)
 	if err != nil {
 		t.Fatalf("%s(%d): can't get %s: %s", file, line, path, err)
 	}
@@ -18,7 +19,7 @@
 
 func put(t *testing.T, st storage.Store, tr storage.Transaction, path string, v interface{}) storage.ID {
 	_, file, line, _ := runtime.Caller(1)
-	stat, err := st.Bind(path).Put(tr, v)
+	stat, err := st.Bind(path).Put(rt.R().NewContext(), tr, v)
 	if err != nil || !stat.ID.IsValid() {
 		t.Fatalf("%s(%d): can't put %s: %s", file, line, path, err)
 	}
@@ -26,14 +27,14 @@
 }
 
 func remove(t *testing.T, st storage.Store, tr storage.Transaction, path string) {
-	if err := st.Bind(path).Remove(tr); err != nil {
+	if err := st.Bind(path).Remove(rt.R().NewContext(), tr); err != nil {
 		_, file, line, _ := runtime.Caller(1)
 		t.Errorf("%s(%d): can't remove %s: %s", file, line, path, err)
 	}
 }
 
 func commit(t *testing.T, tr storage.Transaction) {
-	if err := tr.Commit(); err != nil {
+	if err := tr.Commit(rt.R().NewContext()); err != nil {
 		t.Fatalf("Transaction aborted: %s", err)
 	}
 }
diff --git a/examples/todos/todos_init/main.go b/examples/todos/todos_init/main.go
index de829b3..6121a38 100644
--- a/examples/todos/todos_init/main.go
+++ b/examples/todos/todos_init/main.go
@@ -74,7 +74,7 @@
 func (st *state) put(path string, v interface{}) {
 	vlog.Infof("Storing %q = %+v", path, v)
 	st.makeParentDirs(path)
-	if _, err := st.store.Bind(path).Put(st.transaction, v); err != nil {
+	if _, err := st.store.Bind(path).Put(rt.R().TODOContext(), st.transaction, v); err != nil {
 		vlog.Errorf("put failed: %s: %s", path, err)
 		return
 	}
@@ -87,8 +87,8 @@
 	for i, _ := range l {
 		prefix := filepath.Join(l[:i]...)
 		o := st.store.Bind(prefix)
-		if _, err := o.Get(st.transaction); err != nil {
-			if _, err := o.Put(st.transaction, &schema.Dir{}); err != nil {
+		if _, err := o.Get(rt.R().TODOContext(), st.transaction); err != nil {
+			if _, err := o.Put(rt.R().TODOContext(), st.transaction, &schema.Dir{}); err != nil {
 				vlog.Errorf("Error creating parent %q: %s", prefix, err)
 			}
 		}
@@ -97,12 +97,12 @@
 
 // newTransaction starts a new transaction.
 func (st *state) newTransaction() {
-	st.transaction = primitives.NewTransaction()
+	st.transaction = primitives.NewTransaction(rt.R().TODOContext())
 }
 
 // commit commits the current transaction.
 func (st *state) commit() {
-	if err := st.transaction.Commit(); err != nil {
+	if err := st.transaction.Commit(rt.R().TODOContext()); err != nil {
 		vlog.Errorf("Failed to commit transaction: %s", err)
 	}
 	st.transaction = nil
diff --git a/examples/tunnel/tunnel.vdl.go b/examples/tunnel/tunnel.vdl.go
index fb26dbb..32fbb6c 100644
--- a/examples/tunnel/tunnel.vdl.go
+++ b/examples/tunnel/tunnel.vdl.go
@@ -45,13 +45,13 @@
 	// the byte stream is forwarded to the requested network address and all the
 	// data received from that network connection is sent back in the reply
 	// stream.
-	Forward(network string, address string, opts ..._gen_ipc.ClientCallOpt) (reply TunnelForwardStream, err error)
+	Forward(ctx _gen_ipc.Context, network string, address string, opts ..._gen_ipc.CallOpt) (reply TunnelForwardStream, err error)
 	// The Shell method is used to either run shell commands remotely, or to open
 	// an interactive shell. The data received over the byte stream is sent to the
 	// shell's stdin, and the data received from the shell's stdout and stderr is
 	// sent back in the reply stream. It returns the exit status of the shell
 	// command.
-	Shell(command string, shellOpts ShellOpts, opts ..._gen_ipc.ClientCallOpt) (reply TunnelShellStream, err error)
+	Shell(ctx _gen_ipc.Context, command string, shellOpts ShellOpts, opts ..._gen_ipc.CallOpt) (reply TunnelShellStream, err error)
 }
 type Tunnel interface {
 	_gen_ipc.UniversalServiceMethods
@@ -65,13 +65,13 @@
 	// the byte stream is forwarded to the requested network address and all the
 	// data received from that network connection is sent back in the reply
 	// stream.
-	Forward(context _gen_ipc.Context, network string, address string, stream TunnelServiceForwardStream) (err error)
+	Forward(context _gen_ipc.ServerContext, network string, address string, stream TunnelServiceForwardStream) (err error)
 	// The Shell method is used to either run shell commands remotely, or to open
 	// an interactive shell. The data received over the byte stream is sent to the
 	// shell's stdin, and the data received from the shell's stdout and stderr is
 	// sent back in the reply stream. It returns the exit status of the shell
 	// command.
-	Shell(context _gen_ipc.Context, command string, shellOpts ShellOpts, stream TunnelServiceShellStream) (reply int32, err error)
+	Shell(context _gen_ipc.ServerContext, command string, shellOpts ShellOpts, stream TunnelServiceShellStream) (reply int32, err error)
 }
 
 // TunnelForwardStream is the interface for streaming responses of the method
@@ -102,7 +102,7 @@
 
 // Implementation of the TunnelForwardStream interface that is not exported.
 type implTunnelForwardStream struct {
-	clientCall _gen_ipc.ClientCall
+	clientCall _gen_ipc.Call
 }
 
 func (c *implTunnelForwardStream) Send(item []byte) error {
@@ -183,7 +183,7 @@
 
 // Implementation of the TunnelShellStream interface that is not exported.
 type implTunnelShellStream struct {
-	clientCall _gen_ipc.ClientCall
+	clientCall _gen_ipc.Call
 }
 
 func (c *implTunnelShellStream) Send(item ClientShellPacket) error {
@@ -279,27 +279,27 @@
 	name   string
 }
 
-func (__gen_c *clientStubTunnel) Forward(network string, address string, opts ..._gen_ipc.ClientCallOpt) (reply TunnelForwardStream, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "Forward", []interface{}{network, address}, opts...); err != nil {
+func (__gen_c *clientStubTunnel) Forward(ctx _gen_ipc.Context, network string, address string, opts ..._gen_ipc.CallOpt) (reply TunnelForwardStream, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "Forward", []interface{}{network, address}, opts...); err != nil {
 		return
 	}
 	reply = &implTunnelForwardStream{clientCall: call}
 	return
 }
 
-func (__gen_c *clientStubTunnel) Shell(command string, shellOpts ShellOpts, opts ..._gen_ipc.ClientCallOpt) (reply TunnelShellStream, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "Shell", []interface{}{command, shellOpts}, opts...); err != nil {
+func (__gen_c *clientStubTunnel) Shell(ctx _gen_ipc.Context, command string, shellOpts ShellOpts, opts ..._gen_ipc.CallOpt) (reply TunnelShellStream, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "Shell", []interface{}{command, shellOpts}, opts...); err != nil {
 		return
 	}
 	reply = &implTunnelShellStream{clientCall: call}
 	return
 }
 
-func (__gen_c *clientStubTunnel) UnresolveStep(opts ..._gen_ipc.ClientCallOpt) (reply []string, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "UnresolveStep", nil, opts...); err != nil {
+func (__gen_c *clientStubTunnel) UnresolveStep(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply []string, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "UnresolveStep", nil, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -308,9 +308,9 @@
 	return
 }
 
-func (__gen_c *clientStubTunnel) Signature(opts ..._gen_ipc.ClientCallOpt) (reply _gen_ipc.ServiceSignature, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "Signature", nil, opts...); err != nil {
+func (__gen_c *clientStubTunnel) Signature(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply _gen_ipc.ServiceSignature, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "Signature", nil, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -319,9 +319,9 @@
 	return
 }
 
-func (__gen_c *clientStubTunnel) GetMethodTags(method string, opts ..._gen_ipc.ClientCallOpt) (reply []interface{}, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "GetMethodTags", []interface{}{method}, opts...); err != nil {
+func (__gen_c *clientStubTunnel) GetMethodTags(ctx _gen_ipc.Context, method string, opts ..._gen_ipc.CallOpt) (reply []interface{}, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "GetMethodTags", []interface{}{method}, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
diff --git a/examples/tunnel/tunneld/impl/impl.go b/examples/tunnel/tunneld/impl/impl.go
index cd210ed..9458947 100644
--- a/examples/tunnel/tunneld/impl/impl.go
+++ b/examples/tunnel/tunneld/impl/impl.go
@@ -22,7 +22,7 @@
 type T struct {
 }
 
-func (t *T) Forward(ctx ipc.Context, network, address string, stream tunnel.TunnelServiceForwardStream) error {
+func (t *T) Forward(ctx ipc.ServerContext, network, address string, stream tunnel.TunnelServiceForwardStream) error {
 	conn, err := net.Dial(network, address)
 	if err != nil {
 		return err
@@ -34,7 +34,7 @@
 	return err
 }
 
-func (t *T) Shell(ctx ipc.Context, command string, shellOpts tunnel.ShellOpts, stream tunnel.TunnelServiceShellStream) (int32, error) {
+func (t *T) Shell(ctx ipc.ServerContext, command string, shellOpts tunnel.ShellOpts, stream tunnel.TunnelServiceShellStream) (int32, error) {
 	vlog.Infof("SHELL START for %v: %q", ctx.RemoteID(), command)
 
 	const nonShellErrorCode = 255
diff --git a/examples/tunnel/vsh/main.go b/examples/tunnel/vsh/main.go
index 943835e..42165b4 100644
--- a/examples/tunnel/vsh/main.go
+++ b/examples/tunnel/vsh/main.go
@@ -96,7 +96,7 @@
 
 	opts := shellOptions(cmd)
 
-	stream, err := t.Shell(cmd, opts, veyron2.CallTimeout(24*time.Hour))
+	stream, err := t.Shell(rt.R().TODOContext(), cmd, opts, veyron2.CallTimeout(24*time.Hour))
 	if err != nil {
 		fmt.Fprintf(os.Stderr, "Error: %v\n", err)
 		return 1
@@ -196,7 +196,7 @@
 			vlog.Infof("Accept failed: %v", err)
 			continue
 		}
-		stream, err := t.Forward(*rprotocol, raddr, veyron2.CallTimeout(24*time.Hour))
+		stream, err := t.Forward(rt.R().TODOContext(), *rprotocol, raddr, veyron2.CallTimeout(24*time.Hour))
 		if err != nil {
 			vlog.Infof("Tunnel(%q, %q) failed: %v", *rprotocol, raddr, err)
 			conn.Close()
diff --git a/examples/unresolve/test_util.go b/examples/unresolve/test_util.go
index 0b6f6c2..09d877c 100644
--- a/examples/unresolve/test_util.go
+++ b/examples/unresolve/test_util.go
@@ -22,8 +22,8 @@
 	return rt.Init(opts...).Shutdown
 }
 
-func newServer() ipc.Server {
-	server, err := rt.R().NewServer()
+func newServer(opts ...ipc.ServerOpt) ipc.Server {
+	server, err := rt.R().NewServer(opts...)
 	if err != nil {
 		panic(fmt.Sprintf("r.NewServer failed with %v", err))
 	}
@@ -41,9 +41,9 @@
 	return naming.JoinAddressName(ep.String(), prefix)
 }
 
-func serverMain(serviceCreator func(ipc.Server) string, args []string) {
+func serverMain(servesMT bool, serviceCreator func(ipc.Server) string, args []string) {
 	defer initRT()()
-	server := newServer()
+	server := newServer(veyron2.ServesMountTableOpt(servesMT))
 	defer server.Stop()
 	service := serviceCreator(server)
 	vlog.Infof("created %v", service)
@@ -65,7 +65,7 @@
 }
 
 func childMT(args []string) {
-	serverMain(createMT, args)
+	serverMain(true, createMT, args)
 }
 
 func createMTClient(name string) mtidl.MountTable {
@@ -80,11 +80,11 @@
 
 type fortune struct{}
 
-func (*fortune) Get(ipc.Context) (string, error) {
+func (*fortune) Get(ipc.ServerContext) (string, error) {
 	return fixedFortuneMessage, nil
 }
 
-func (*fortune) Add(ipc.Context, string) error {
+func (*fortune) Add(ipc.ServerContext, string) error {
 	return nil
 }
 
@@ -93,22 +93,22 @@
 }
 
 func childFortune(args []string) {
-	serverMain(createFortune, args)
+	serverMain(false, createFortune, args)
 }
 
 type fortuneCustomUnresolve struct {
 	custom string
 }
 
-func (*fortuneCustomUnresolve) Get(ipc.Context) (string, error) {
+func (*fortuneCustomUnresolve) Get(ipc.ServerContext) (string, error) {
 	return fixedFortuneMessage, nil
 }
 
-func (*fortuneCustomUnresolve) Add(ipc.Context, string) error {
+func (*fortuneCustomUnresolve) Add(ipc.ServerContext, string) error {
 	return nil
 }
 
-func (*fortuneCustomUnresolve) UnresolveStep(context ipc.Context) ([]string, error) {
+func (*fortuneCustomUnresolve) UnresolveStep(context ipc.ServerContext) ([]string, error) {
 	servers, err := rt.R().MountTable().ResolveToMountTable("I/want/to/know")
 	if err != nil {
 		return nil, err
@@ -124,14 +124,15 @@
 func createFortuneCustomUnresolve(server ipc.Server) string {
 	oa := createServer(server, "tell/me/the/future", ipc.SoloDispatcher(fortuneidl.NewServerFortune(new(fortuneCustomUnresolve)), nil))
 	ep, _ := naming.SplitAddressName(oa)
-	oa = naming.JoinAddressName(ep, "tell/me")
+	oa = naming.MakeTerminal(naming.JoinAddressName(ep, "tell/me"))
 	// Doesn't get unmounted.  Fine for a test.
+	oa = naming.MakeTerminal(oa)
 	rt.R().MountTable().Mount("I/want/to/know", oa, 0)
 	return oa
 }
 
 func childFortuneCustomUnresolve(args []string) {
-	serverMain(createFortuneCustomUnresolve, args)
+	serverMain(false, createFortuneCustomUnresolve, args)
 }
 
 func createFortuneClient(rt veyron2.Runtime, name string) fortuneidl.Fortune {
@@ -166,12 +167,12 @@
 }
 
 func childFortuneNoIDL(args []string) {
-	serverMain(createFortuneNoIDL, args)
+	serverMain(false, createFortuneNoIDL, args)
 }
 
 func resolveStep(t *testing.T, name string) string {
 	client := createMTClient(name)
-	results, suffix, err := client.ResolveStep()
+	results, suffix, err := client.ResolveStep(rt.R().NewContext())
 	if err != nil {
 		t.Errorf("ResolveStep on %q failed with %v", name, err)
 		return ""
@@ -197,11 +198,11 @@
 }
 
 type unresolver interface {
-	UnresolveStep(...ipc.ClientCallOpt) ([]string, error)
+	UnresolveStep(ipc.Context, ...ipc.CallOpt) ([]string, error)
 }
 
-func unresolveStep(t *testing.T, c unresolver) string {
-	unres, err := c.UnresolveStep()
+func unresolveStep(t *testing.T, ctx ipc.Context, c unresolver) string {
+	unres, err := c.UnresolveStep(ctx)
 	if err != nil {
 		t.Errorf("UnresolveStep failed with %v", err)
 		return ""
diff --git a/examples/unresolve/unresolve_test.go b/examples/unresolve/unresolve_test.go
index f7c2e1a..7a218ab 100644
--- a/examples/unresolve/unresolve_test.go
+++ b/examples/unresolve/unresolve_test.go
@@ -98,11 +98,11 @@
 	// TODO(ataly): Eventually we want to use the same identities the servers
 	// would have if they were running in production.
 	defer initRT()()
-	server := newServer()
-	defer server.Stop()
+	mtServer := newServer(veyron2.ServesMountTableOpt(true))
+	defer mtServer.Stop()
 
 	// Create mounttable A.
-	aOA := createMT(server)
+	aOA := createMT(mtServer)
 	if len(aOA) == 0 {
 		t.Fatalf("aOA is empty")
 	}
@@ -201,6 +201,7 @@
 	os.Setenv("VEYRON_IDENTITY", idFile)
 
 	r, _ := rt.New(veyron2.MountTableRoots([]string{aOA}))
+	ctx := r.NewContext()
 
 	resolveCases := []struct {
 		name, resolved string
@@ -249,19 +250,19 @@
 	for _, c := range unresolveStepCases {
 		// Verify that we can talk to the server.
 		client := createFortuneClient(r, c.name)
-		if fortuneMessage, err := client.Get(); err != nil {
+		if fortuneMessage, err := client.Get(r.NewContext()); err != nil {
 			t.Errorf("fortune.Get failed with %v", err)
 		} else if fortuneMessage != fixedFortuneMessage {
 			t.Errorf("fortune expected %q, got %q instead", fixedFortuneMessage, fortuneMessage)
 		}
 
 		// Unresolve, one step.
-		if want, got := c.unresStep1, unresolveStep(t, client); want != got {
+		if want, got := c.unresStep1, unresolveStep(t, ctx, client); want != got {
 			t.Errorf("fortune.UnresolveStep expected %q, got %q instead", want, got)
 		}
 
 		// Go up the tree, unresolve another step.
-		if want, got := c.unresStep2, unresolveStep(t, createMTClient(naming.MakeTerminal(c.unresStep1))); want != got {
+		if want, got := c.unresStep2, unresolveStep(t, ctx, createMTClient(naming.MakeTerminal(c.unresStep1))); want != got {
 			t.Errorf("mt.UnresolveStep expected %q, got %q instead", want, got)
 		}
 	}
@@ -271,14 +272,14 @@
 
 	// Verify that we can talk to server E.
 	eClient := createFortuneClient(r, "b/mt/e1/fortune")
-	if fortuneMessage, err := eClient.Get(); err != nil {
+	if fortuneMessage, err := eClient.Get(ctx); err != nil {
 		t.Errorf("fortune.Get failed with %v", err)
 	} else if fortuneMessage != fixedFortuneMessage {
 		t.Errorf("fortune expected %q, got %q instead", fixedFortuneMessage, fortuneMessage)
 	}
 
 	// Unresolve E, one step.
-	eUnres, err := eClient.UnresolveStep()
+	eUnres, err := eClient.UnresolveStep(ctx)
 	if err != nil {
 		t.Errorf("UnresolveStep failed with %v", err)
 	}
@@ -288,12 +289,12 @@
 
 	// Try unresolve step on a random name in B.
 	if want, got := naming.JoinAddressName(aAddr, "mt/b/mt/some/random/name"),
-		unresolveStep(t, createMTClient(naming.JoinAddressName(bAddr, "//mt/some/random/name"))); want != got {
+		unresolveStep(t, ctx, createMTClient(naming.JoinAddressName(bAddr, "//mt/some/random/name"))); want != got {
 		t.Errorf("b.UnresolveStep expected %q, got %q instead", want, got)
 	}
 
 	// Try unresolve step on a random name in A.
-	if unres, err := createMTClient(naming.JoinAddressName(aAddr, "//mt/another/random/name")).UnresolveStep(); err != nil {
+	if unres, err := createMTClient(naming.JoinAddressName(aAddr, "//mt/another/random/name")).UnresolveStep(ctx); err != nil {
 		t.Errorf("UnresolveStep failed with %v", err)
 	} else if len(unres) > 0 {
 		t.Errorf("b.UnresolveStep expected no results, got %q instead", unres)
diff --git a/examples/veyron_browser/.gitignore b/examples/veyron_browser/.gitignore
deleted file mode 100644
index ba46267..0000000
--- a/examples/veyron_browser/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-browser/lib
diff --git a/examples/veyron_browser/Makefile b/examples/veyron_browser/Makefile
deleted file mode 100644
index 1c8bc3b..0000000
--- a/examples/veyron_browser/Makefile
+++ /dev/null
@@ -1,58 +0,0 @@
-#
-# TODO(aghassemi) These commands are just for convenience.
-# Remove this file and references to it from README before release.
-#
-
-PATH:=$(PATH):$(VEYRON_ENV)/cout/node/bin
-VEYRON_MOUNTTABLE= ../../../../bin/mounttabled
-VEYRON_WSPR= ../../../../bin/wsprd
-VEYRON_PROXY= ../../../../bin/proxyd
-VEYRON_IDENT= ../../../../bin/identity
-VEYRON_IDENTITYD= ../../../../bin/identityd
-VEYRON_STORE= ../../../../bin/stored
-VEYRON_MOUNTTABLE_PORT= 5167
-VEYRON_MOUNTTABLE_PORT2= 5168
-VEYRON_PROXY_PORT= 5164
-VEYRON_PROXY_ADDR= 127.0.0.1:$(VEYRON_PROXY_PORT)
-VEYRON_WSPR_PORT= 5165
-VEYRON_IDENTITY_PORT= 5163
-VEYRON_STORE_PORT= 5166
-VEYRON_JS_API= ../../../../../javascript/api
-VEYRON_IDENTITY_PATH= /tmp/veyron_browser_identity
-
-# Builds everything
-default: build
-build: buildbrowser
-
-# Builds browser version of FortuneJS
-buildbrowser:
-	(cd $(VEYRON_JS_API) && ./vgrunt build) && \
-	mkdir -p ./browser/lib && \
-	cp -rf $(VEYRON_JS_API)/dist/*.* ./browser/lib
-
-# Deploys Veyron daemons
-daemons:
-	@if [[ ! -e $(VEYRON_PROXY) ]]; then \
-		echo "Veyron proxy could not be found in $(VEYRON_PROXY). Please build and install veyron2 and services first"; \
-		exit 1; \
-	fi
-
-	$(VEYRON_IDENT) --name=veyron_browser_identity > $(VEYRON_IDENTITY_PATH)
-
-	export VEYRON_IDENTITY=$(VEYRON_IDENTITY_PATH) ; \
-	$(VEYRON_IDENTITYD) --port=$(VEYRON_IDENTITY_PORT) & \
-	$(VEYRON_MOUNTTABLE) --address=:$(VEYRON_MOUNTTABLE_PORT) --prefix= & \
-	export MOUNTTABLE_ROOT=/localhost:$(VEYRON_MOUNTTABLE_PORT) ; \
-	$(VEYRON_PROXY) -address=$(VEYRON_PROXY_ADDR) & \
-	$(VEYRON_WSPR) --v=3 -logtostderr=true -vproxy=$(VEYRON_PROXY_ADDR) --port $(VEYRON_WSPR_PORT) & \
-	$(VEYRON_MOUNTTABLE) --address=:$(VEYRON_MOUNTTABLE_PORT2) --name=global --prefix= & \
-	sleep 1 ; \
-	$(VEYRON_STORE) --address=:$(VEYRON_STORE_PORT) --name=global/$(USER)/store &
-
-killdaemons:
-	kill `lsof -t -i:$(VEYRON_MOUNTTABLE_PORT)`; \
-	kill `lsof -t -i:$(VEYRON_MOUNTTABLE_PORT2)`; \
-	kill `lsof -t -i:$(VEYRON_IDENTITY_PORT)`; \
-	kill `lsof -t -i:$(VEYRON_WSPR_PORT)`; \
-	kill `lsof -t -i:$(VEYRON_PROXY_PORT)`; \
-	kill `lsof -t -i:$(VEYRON_STORE_PORT)`
diff --git a/examples/veyron_browser/README b/examples/veyron_browser/README
deleted file mode 100644
index 96bd7ae..0000000
--- a/examples/veyron_browser/README
+++ /dev/null
@@ -1,27 +0,0 @@
-# Mounttable Browser
-Mountable browser is a browser application that lets the user view and traverse mounttables.
-
-## Building
-Before you can run Mounttable Browser, you need to build. Simply run:
-
-```sh
-make
-```
-or
-
-```sh
-make build
-```
-
-## Running
-
-### Daemons
-Before you can run mounttable browser, a number of servers must be started.
-
-To run these daemons, simply run:
-
-```sh
-make daemons
-```
-
-after the daemons are started, simply open browser/client/client.html in a browser.
\ No newline at end of file
diff --git a/examples/veyron_browser/browser/client/client.html b/examples/veyron_browser/browser/client/client.html
deleted file mode 100644
index 7bd1880..0000000
--- a/examples/veyron_browser/browser/client/client.html
+++ /dev/null
@@ -1,34 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-  <title>Mounttable browser</title>
-  <style>
-  a.remote {
-    color: #ff0000;
-  }
-  a.local {
-    color: #0000ff;
-  }
-  a.service{
-    color: #000000;
-  }
-  a.error{
-    color: #ffaa00;
-  }
-  </style>
-</head>
-<body onload="init()">
-  <div>
-    Enter mounttable: <input id="mt" type="text" value=""></input><input type="submit" value="connect" onclick="init()"></input>
-  </div>
-  <div>
-    Enter query: <input id="query" type="text" onkeyup="handleChange()" value="*"></input>
-  </div>
-  <div id="results"></div>
-  <script src="../lib/veyron.js"></script>
-  <script src="../config.js"></script>
-  <script src="promises.js"></script>
-  <script src="mounttable.js"></script>
-  <script src="client.js"></script>
-</body>
-</html>
diff --git a/examples/veyron_browser/browser/client/client.js b/examples/veyron_browser/browser/client/client.js
deleted file mode 100644
index 4fc7c4d..0000000
--- a/examples/veyron_browser/browser/client/client.js
+++ /dev/null
@@ -1,63 +0,0 @@
-var veyron = new Veyron(veyronConfig);
-var mountTable = veyron.newMountTable();
-var client = veyron.newClient();
-var mp;
-
-var init = function() {
-  var mtAddr = document.getElementById('mt').value;
-  mountTable.then(function(mt) {
-    mp = new MountPoint(client, mt, mtAddr);
-    handleChange();
-  });
-}
-
-var updateResults = function(query) {
-  var results = document.getElementById('results');
-  results.innerHTML = '<i>Loading results...</i>';
-
-  // perform query.
-  mp.glob(query).then(function(items) {
-    // generate the results list.
-    var list = document.createElement('ul');
-    for (var i in items) {
-      var item = items[i];
-      var li = document.createElement('li');
-      var a = document.createElement('a');
-      
-      a.innerHTML = item.name + ' - ' + JSON.stringify(item);
-      (function(item, a) {
-        isMounttable(client, item).then(function(isMt) {
-          if (!isMt) {
-            a.className = "service";
-          } else {
-            a.href = '#';
-            a.onclick = function() {
-              mp = mp.appendToPath(item.name);
-              handleChange();
-            };
-            if (item.servers.length > 0) {
-              a.className = 'remote';
-            } else {
-              a.className = 'local';
-            }
-          }
-        }, function(reason) {
-          console.error('Error testing mounttable: ', reason);
-          a.className = "error";
-        });
-      })(item, a);
-      
-      li.appendChild(a);
-      list.appendChild(li);
-    }
-    results.innerHTML = '';
-    results.appendChild(list);
-  }).catch(function(msg) {
-    console.error('Problem loading page: ' + msg);
-  });
-}
-
-var handleChange = function() {
-  document.getElementById('mt').value = mp.name;
-  updateResults(document.getElementById('query').value);
-}
diff --git a/examples/veyron_browser/browser/client/mounttable.js b/examples/veyron_browser/browser/client/mounttable.js
deleted file mode 100644
index ad79a28..0000000
--- a/examples/veyron_browser/browser/client/mounttable.js
+++ /dev/null
@@ -1,127 +0,0 @@
-(function(exports) {
-/**
- * MountPoint handles manipulating and querying from
- * a mounttable.
- * @param {object} client A veyron client.
- * @param {object} mountTable A veyron MountTable instance.
- * @param {...string} addressParts Parts of the address to join
- * @constructor
- */
-var MountPoint = function(client, mountTable, addressParts) {
-  this.client = client;
-  this.mountTable = mountTable;
-  this.name = Array.prototype.slice.call(arguments, 2).join('/');
-  this._terminalNames = null;
-}
-
-/**
- * A helper method that returns the terminal names for this
- * MountPoint and memoizes them.
- * @return {Promise} A promise that resolves to a list of terminal names.
- */
-MountPoint.prototype._getTerminalNames = function() {
-  // We resolve to a terminal name manually because veyron rpc calls
-  // wont usually resolve a name if it's to a mounttable.  We
-  // would like to interact with all kinds of servers.
-  if (!this._terminalNames) {
-    this._terminalNames = this.mountTable.resolveMaximally(this.name);
-  }
-  return this._terminalNames;
-}
-
-/**
- * appendToPath appends to the mountpoint path
- * @param {...string} toAdd strings to add to the path.
- * @return {MountPoint} a new mount point with the path args appended
- * to the current path.
- */
-MountPoint.prototype.appendToPath = function(toAdd) {
-  var args = Array.prototype.slice.call(arguments);
-  if (this.name.length > 0) {
-    args.unshift(this.name);
-  }
-  return new MountPoint(this.client, this.mountTable, args.join('/'));
-}
-
-/**
- * mount mounts a target to the current mount point.
- * @param {string} target The target to be mounted.
- * @return {promise} a promise that completes when it is mounted
- */
-MountPoint.prototype.mount = function(target) {
-  return this._getTerminalNames().then(function(terminalNames) {
-    // TODO(mattr): We should try all the names instead of just the first.
-    // Perhpas the library should allow me to pass a list of names.
-    return this.client.bind(terminalNames[0]).then(function(mtService) {
-      return mtService.mount(target, 0);
-    })
-  });
-}
-
-/**
- * glob makes a glob request to a server relative to the current mountpoint.
- * @param {string} expr The glob expression e.g. A/B/*.
- * @return {promise} a promise to a list of results
- */
-MountPoint.prototype.glob = function(expr) {
-  var results = [];
-  return this._getTerminalNames().then(function(terminalNames) {
-    // TODO(mattr): We should try all the names instead of just the first.
-    // Perhpas the library should allow me to pass a list of names.
-    return this.client.bind(terminalNames[0]).then(function(mtService) {
-      var promise = mtService.glob(expr);
-      var stream = promise.stream;
-      
-      stream.on('readable', function() {
-        var val = stream.read();
-        if (val) {
-          results.push(val);
-        }
-      });
-      
-      return promise.then(function() {
-        return results;
-      });
-    });
-  });
-};
-
-/**
- * isMounttable determines if a specific address refers to a
- * mounttable.
- * @param {object} client the veyron client to use.
- * @param {string} globResult result of glob to check.
- * @return {promise} promise to a boolean indicating if it is
- * a mounttable.
- */
- // TODO(bprosnitz) Remove dependency on _proxyConnection.
- // TODO(bprosnitz) Consider adding interface name to signature and using that.
-var isMounttable = function(client, globResult) {
-  if (globResult.servers.length === 0) {
-    // This is on the same mounttable as the globResult.
-    return new Promise(function(resolve) {
-      resolve(true);
-    });
-  }
-
-  var pconn = client._proxyConnection;
-  var promises = [];
-  for (var i in globResult.servers) {
-    promises.push((function(server) {
-      return pconn.getServiceSignature(server)
-    })(globResult.servers[i].server).then(function(sig) {
-      if (sig['glob'] !== undefined) {
-        if (sig['glob'].inArgs.length == 1) {
-          return true;
-        }
-      }
-      return false;
-    }));
-  }
-
-  return resolveRace(promises);
-}
-
-exports.MountPoint = MountPoint;
-exports.isMounttable = isMounttable;
-})(window);
diff --git a/examples/veyron_browser/browser/client/promises.js b/examples/veyron_browser/browser/client/promises.js
deleted file mode 100644
index 3b604ae..0000000
--- a/examples/veyron_browser/browser/client/promises.js
+++ /dev/null
@@ -1,28 +0,0 @@
-(function(exports) {
-/**
- * resolveRace returns a promise that resolves when the first promise
- * resolves and rejects only after every promise has rejected.
- * @param {promise[]} promises a list of promises.
- * @return {promse} a promise that resolves when any of the inputs resolve, or
- * when all of the inputs reject.
- */
-function resolveRace(promises) {
-    var resolve, reject;
-    var promise = new Promise(function(pResolve, pReject) {
-        resolve = pResolve;
-        reject = pReject;
-    });
-    var numRejects = 0;
-    for (var i in promises) {
-        promises[i].then(resolve, function(reason) {
-            numRejects++;
-            if (numRejects == promises.length) {
-                reject(reason);
-            }
-        });
-    }
-    return promise;
-};
-
-exports.resolveRace = resolveRace;
-})(window);
\ No newline at end of file
diff --git a/examples/veyron_browser/browser/config.js b/examples/veyron_browser/browser/config.js
deleted file mode 100644
index 041055e..0000000
--- a/examples/veyron_browser/browser/config.js
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Optional configuration to be used to create the Veyron object.
- * It specifies location of services that Veyron depends on such as identity
- * server and proxy daemons.
- *
- * If not specified, public Google-hosted daemons will be used.
- * TODO(aghassemi) Use Vonery and remove this before release
- */
-var veyronConfig = {
-  // Log severity, INFO means log anything equal or more severe than INFO
-  // One of NOLOG, ERROR, WARNING, DEBUG, INFO
-  'logLevel': Veyron.logLevels.INFO,
-
-  // Server to use for identity
-  'identityServer': 'http://localhost:5163/random/',
-
-  // Daemon that handles JavaScript communication with the rest of Veyron
-  'proxy': 'http://localhost:5165'
-};
diff --git a/examples/wspr_sample/cache.vdl.go b/examples/wspr_sample/cache.vdl.go
index da23ee0..d19d606 100644
--- a/examples/wspr_sample/cache.vdl.go
+++ b/examples/wspr_sample/cache.vdl.go
@@ -25,45 +25,45 @@
 // to enable embedding without method collisions.  Not to be used directly by clients.
 type Cache_ExcludingUniversal interface {
 	// Set sets a value for a key.
-	Set(key string, value _gen_vdl.Any, opts ..._gen_ipc.ClientCallOpt) (err error)
+	Set(ctx _gen_ipc.Context, key string, value _gen_vdl.Any, opts ..._gen_ipc.CallOpt) (err error)
 	// Get returns the value for a key.  If the value is not found, returns
 	// a not found error.
-	Get(key string, opts ..._gen_ipc.ClientCallOpt) (reply _gen_vdl.Any, err error)
+	Get(ctx _gen_ipc.Context, key string, opts ..._gen_ipc.CallOpt) (reply _gen_vdl.Any, err error)
 	// Same as Get, but casts the return argument to an byte.
-	GetAsByte(key string, opts ..._gen_ipc.ClientCallOpt) (reply byte, err error)
+	GetAsByte(ctx _gen_ipc.Context, key string, opts ..._gen_ipc.CallOpt) (reply byte, err error)
 	// Same as Get, but casts the return argument to an int32.
-	GetAsInt32(key string, opts ..._gen_ipc.ClientCallOpt) (reply int32, err error)
+	GetAsInt32(ctx _gen_ipc.Context, key string, opts ..._gen_ipc.CallOpt) (reply int32, err error)
 	// Same as Get, but casts the return argument to an int64.
-	GetAsInt64(key string, opts ..._gen_ipc.ClientCallOpt) (reply int64, err error)
+	GetAsInt64(ctx _gen_ipc.Context, key string, opts ..._gen_ipc.CallOpt) (reply int64, err error)
 	// Same as Get, but casts the return argument to an uint32.
-	GetAsUint32(key string, opts ..._gen_ipc.ClientCallOpt) (reply uint32, err error)
+	GetAsUint32(ctx _gen_ipc.Context, key string, opts ..._gen_ipc.CallOpt) (reply uint32, err error)
 	// Same as Get, but casts the return argument to an uint64.
-	GetAsUint64(key string, opts ..._gen_ipc.ClientCallOpt) (reply uint64, err error)
+	GetAsUint64(ctx _gen_ipc.Context, key string, opts ..._gen_ipc.CallOpt) (reply uint64, err error)
 	// Same as Get, but casts the return argument to an float32.
-	GetAsFloat32(key string, opts ..._gen_ipc.ClientCallOpt) (reply float32, err error)
+	GetAsFloat32(ctx _gen_ipc.Context, key string, opts ..._gen_ipc.CallOpt) (reply float32, err error)
 	// Same as Get, but casts the return argument to an float64.
-	GetAsFloat64(key string, opts ..._gen_ipc.ClientCallOpt) (reply float64, err error)
+	GetAsFloat64(ctx _gen_ipc.Context, key string, opts ..._gen_ipc.CallOpt) (reply float64, err error)
 	// Same as Get, but casts the return argument to a string.
-	GetAsString(key string, opts ..._gen_ipc.ClientCallOpt) (reply string, err error)
+	GetAsString(ctx _gen_ipc.Context, key string, opts ..._gen_ipc.CallOpt) (reply string, err error)
 	// Same as Get, but casts the return argument to a bool.
-	GetAsBool(key string, opts ..._gen_ipc.ClientCallOpt) (reply bool, err error)
+	GetAsBool(ctx _gen_ipc.Context, key string, opts ..._gen_ipc.CallOpt) (reply bool, err error)
 	// Same as Get, but casts the return argument to an error.
-	GetAsError(key string, opts ..._gen_ipc.ClientCallOpt) (reply error, err error)
+	GetAsError(ctx _gen_ipc.Context, key string, opts ..._gen_ipc.CallOpt) (reply error, err error)
 	// AsMap returns the full contents of the cache as a map.
-	AsMap(opts ..._gen_ipc.ClientCallOpt) (reply map[string]_gen_vdl.Any, err error)
+	AsMap(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply map[string]_gen_vdl.Any, err error)
 	// KeyValuePairs returns the full contents of the cache as a slice of pairs.
-	KeyValuePairs(opts ..._gen_ipc.ClientCallOpt) (reply []KeyValuePair, err error)
+	KeyValuePairs(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply []KeyValuePair, err error)
 	// MostRecentSet returns the key and value and the timestamp for the most
 	// recent set operation
 	// TODO(bprosnitz) support type types and change time to native time type
-	MostRecentSet(opts ..._gen_ipc.ClientCallOpt) (value KeyValuePair, time int64, err error)
+	MostRecentSet(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (value KeyValuePair, time int64, err error)
 	// KeyPage indexes into the keys (in alphanumerically sorted order) and
 	// returns the indexth page of 10 keys.
-	KeyPage(index int64, opts ..._gen_ipc.ClientCallOpt) (reply [10]string, err error)
+	KeyPage(ctx _gen_ipc.Context, index int64, opts ..._gen_ipc.CallOpt) (reply [10]string, err error)
 	// Size returns the total number of entries in the cache.
-	Size(opts ..._gen_ipc.ClientCallOpt) (reply int64, err error)
+	Size(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply int64, err error)
 	// MultiGet sets up a stream that allows fetching multiple keys.
-	MultiGet(opts ..._gen_ipc.ClientCallOpt) (reply CacheMultiGetStream, err error)
+	MultiGet(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply CacheMultiGetStream, err error)
 }
 type Cache interface {
 	_gen_ipc.UniversalServiceMethods
@@ -74,45 +74,45 @@
 type CacheService interface {
 
 	// Set sets a value for a key.
-	Set(context _gen_ipc.Context, key string, value _gen_vdl.Any) (err error)
+	Set(context _gen_ipc.ServerContext, key string, value _gen_vdl.Any) (err error)
 	// Get returns the value for a key.  If the value is not found, returns
 	// a not found error.
-	Get(context _gen_ipc.Context, key string) (reply _gen_vdl.Any, err error)
+	Get(context _gen_ipc.ServerContext, key string) (reply _gen_vdl.Any, err error)
 	// Same as Get, but casts the return argument to an byte.
-	GetAsByte(context _gen_ipc.Context, key string) (reply byte, err error)
+	GetAsByte(context _gen_ipc.ServerContext, key string) (reply byte, err error)
 	// Same as Get, but casts the return argument to an int32.
-	GetAsInt32(context _gen_ipc.Context, key string) (reply int32, err error)
+	GetAsInt32(context _gen_ipc.ServerContext, key string) (reply int32, err error)
 	// Same as Get, but casts the return argument to an int64.
-	GetAsInt64(context _gen_ipc.Context, key string) (reply int64, err error)
+	GetAsInt64(context _gen_ipc.ServerContext, key string) (reply int64, err error)
 	// Same as Get, but casts the return argument to an uint32.
-	GetAsUint32(context _gen_ipc.Context, key string) (reply uint32, err error)
+	GetAsUint32(context _gen_ipc.ServerContext, key string) (reply uint32, err error)
 	// Same as Get, but casts the return argument to an uint64.
-	GetAsUint64(context _gen_ipc.Context, key string) (reply uint64, err error)
+	GetAsUint64(context _gen_ipc.ServerContext, key string) (reply uint64, err error)
 	// Same as Get, but casts the return argument to an float32.
-	GetAsFloat32(context _gen_ipc.Context, key string) (reply float32, err error)
+	GetAsFloat32(context _gen_ipc.ServerContext, key string) (reply float32, err error)
 	// Same as Get, but casts the return argument to an float64.
-	GetAsFloat64(context _gen_ipc.Context, key string) (reply float64, err error)
+	GetAsFloat64(context _gen_ipc.ServerContext, key string) (reply float64, err error)
 	// Same as Get, but casts the return argument to a string.
-	GetAsString(context _gen_ipc.Context, key string) (reply string, err error)
+	GetAsString(context _gen_ipc.ServerContext, key string) (reply string, err error)
 	// Same as Get, but casts the return argument to a bool.
-	GetAsBool(context _gen_ipc.Context, key string) (reply bool, err error)
+	GetAsBool(context _gen_ipc.ServerContext, key string) (reply bool, err error)
 	// Same as Get, but casts the return argument to an error.
-	GetAsError(context _gen_ipc.Context, key string) (reply error, err error)
+	GetAsError(context _gen_ipc.ServerContext, key string) (reply error, err error)
 	// AsMap returns the full contents of the cache as a map.
-	AsMap(context _gen_ipc.Context) (reply map[string]_gen_vdl.Any, err error)
+	AsMap(context _gen_ipc.ServerContext) (reply map[string]_gen_vdl.Any, err error)
 	// KeyValuePairs returns the full contents of the cache as a slice of pairs.
-	KeyValuePairs(context _gen_ipc.Context) (reply []KeyValuePair, err error)
+	KeyValuePairs(context _gen_ipc.ServerContext) (reply []KeyValuePair, err error)
 	// MostRecentSet returns the key and value and the timestamp for the most
 	// recent set operation
 	// TODO(bprosnitz) support type types and change time to native time type
-	MostRecentSet(context _gen_ipc.Context) (value KeyValuePair, time int64, err error)
+	MostRecentSet(context _gen_ipc.ServerContext) (value KeyValuePair, time int64, err error)
 	// KeyPage indexes into the keys (in alphanumerically sorted order) and
 	// returns the indexth page of 10 keys.
-	KeyPage(context _gen_ipc.Context, index int64) (reply [10]string, err error)
+	KeyPage(context _gen_ipc.ServerContext, index int64) (reply [10]string, err error)
 	// Size returns the total number of entries in the cache.
-	Size(context _gen_ipc.Context) (reply int64, err error)
+	Size(context _gen_ipc.ServerContext) (reply int64, err error)
 	// MultiGet sets up a stream that allows fetching multiple keys.
-	MultiGet(context _gen_ipc.Context, stream CacheServiceMultiGetStream) (err error)
+	MultiGet(context _gen_ipc.ServerContext, stream CacheServiceMultiGetStream) (err error)
 }
 
 // CacheMultiGetStream is the interface for streaming responses of the method
@@ -143,7 +143,7 @@
 
 // Implementation of the CacheMultiGetStream interface that is not exported.
 type implCacheMultiGetStream struct {
-	clientCall _gen_ipc.ClientCall
+	clientCall _gen_ipc.Call
 }
 
 func (c *implCacheMultiGetStream) Send(item string) error {
@@ -239,9 +239,9 @@
 	name   string
 }
 
-func (__gen_c *clientStubCache) Set(key string, value _gen_vdl.Any, opts ..._gen_ipc.ClientCallOpt) (err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "Set", []interface{}{key, value}, opts...); err != nil {
+func (__gen_c *clientStubCache) Set(ctx _gen_ipc.Context, key string, value _gen_vdl.Any, opts ..._gen_ipc.CallOpt) (err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "Set", []interface{}{key, value}, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&err); ierr != nil {
@@ -250,9 +250,9 @@
 	return
 }
 
-func (__gen_c *clientStubCache) Get(key string, opts ..._gen_ipc.ClientCallOpt) (reply _gen_vdl.Any, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "Get", []interface{}{key}, opts...); err != nil {
+func (__gen_c *clientStubCache) Get(ctx _gen_ipc.Context, key string, opts ..._gen_ipc.CallOpt) (reply _gen_vdl.Any, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "Get", []interface{}{key}, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -261,9 +261,9 @@
 	return
 }
 
-func (__gen_c *clientStubCache) GetAsByte(key string, opts ..._gen_ipc.ClientCallOpt) (reply byte, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "GetAsByte", []interface{}{key}, opts...); err != nil {
+func (__gen_c *clientStubCache) GetAsByte(ctx _gen_ipc.Context, key string, opts ..._gen_ipc.CallOpt) (reply byte, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "GetAsByte", []interface{}{key}, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -272,9 +272,9 @@
 	return
 }
 
-func (__gen_c *clientStubCache) GetAsInt32(key string, opts ..._gen_ipc.ClientCallOpt) (reply int32, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "GetAsInt32", []interface{}{key}, opts...); err != nil {
+func (__gen_c *clientStubCache) GetAsInt32(ctx _gen_ipc.Context, key string, opts ..._gen_ipc.CallOpt) (reply int32, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "GetAsInt32", []interface{}{key}, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -283,9 +283,9 @@
 	return
 }
 
-func (__gen_c *clientStubCache) GetAsInt64(key string, opts ..._gen_ipc.ClientCallOpt) (reply int64, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "GetAsInt64", []interface{}{key}, opts...); err != nil {
+func (__gen_c *clientStubCache) GetAsInt64(ctx _gen_ipc.Context, key string, opts ..._gen_ipc.CallOpt) (reply int64, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "GetAsInt64", []interface{}{key}, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -294,9 +294,9 @@
 	return
 }
 
-func (__gen_c *clientStubCache) GetAsUint32(key string, opts ..._gen_ipc.ClientCallOpt) (reply uint32, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "GetAsUint32", []interface{}{key}, opts...); err != nil {
+func (__gen_c *clientStubCache) GetAsUint32(ctx _gen_ipc.Context, key string, opts ..._gen_ipc.CallOpt) (reply uint32, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "GetAsUint32", []interface{}{key}, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -305,9 +305,9 @@
 	return
 }
 
-func (__gen_c *clientStubCache) GetAsUint64(key string, opts ..._gen_ipc.ClientCallOpt) (reply uint64, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "GetAsUint64", []interface{}{key}, opts...); err != nil {
+func (__gen_c *clientStubCache) GetAsUint64(ctx _gen_ipc.Context, key string, opts ..._gen_ipc.CallOpt) (reply uint64, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "GetAsUint64", []interface{}{key}, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -316,9 +316,9 @@
 	return
 }
 
-func (__gen_c *clientStubCache) GetAsFloat32(key string, opts ..._gen_ipc.ClientCallOpt) (reply float32, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "GetAsFloat32", []interface{}{key}, opts...); err != nil {
+func (__gen_c *clientStubCache) GetAsFloat32(ctx _gen_ipc.Context, key string, opts ..._gen_ipc.CallOpt) (reply float32, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "GetAsFloat32", []interface{}{key}, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -327,9 +327,9 @@
 	return
 }
 
-func (__gen_c *clientStubCache) GetAsFloat64(key string, opts ..._gen_ipc.ClientCallOpt) (reply float64, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "GetAsFloat64", []interface{}{key}, opts...); err != nil {
+func (__gen_c *clientStubCache) GetAsFloat64(ctx _gen_ipc.Context, key string, opts ..._gen_ipc.CallOpt) (reply float64, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "GetAsFloat64", []interface{}{key}, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -338,9 +338,9 @@
 	return
 }
 
-func (__gen_c *clientStubCache) GetAsString(key string, opts ..._gen_ipc.ClientCallOpt) (reply string, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "GetAsString", []interface{}{key}, opts...); err != nil {
+func (__gen_c *clientStubCache) GetAsString(ctx _gen_ipc.Context, key string, opts ..._gen_ipc.CallOpt) (reply string, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "GetAsString", []interface{}{key}, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -349,9 +349,9 @@
 	return
 }
 
-func (__gen_c *clientStubCache) GetAsBool(key string, opts ..._gen_ipc.ClientCallOpt) (reply bool, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "GetAsBool", []interface{}{key}, opts...); err != nil {
+func (__gen_c *clientStubCache) GetAsBool(ctx _gen_ipc.Context, key string, opts ..._gen_ipc.CallOpt) (reply bool, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "GetAsBool", []interface{}{key}, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -360,9 +360,9 @@
 	return
 }
 
-func (__gen_c *clientStubCache) GetAsError(key string, opts ..._gen_ipc.ClientCallOpt) (reply error, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "GetAsError", []interface{}{key}, opts...); err != nil {
+func (__gen_c *clientStubCache) GetAsError(ctx _gen_ipc.Context, key string, opts ..._gen_ipc.CallOpt) (reply error, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "GetAsError", []interface{}{key}, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -371,9 +371,9 @@
 	return
 }
 
-func (__gen_c *clientStubCache) AsMap(opts ..._gen_ipc.ClientCallOpt) (reply map[string]_gen_vdl.Any, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "AsMap", nil, opts...); err != nil {
+func (__gen_c *clientStubCache) AsMap(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply map[string]_gen_vdl.Any, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "AsMap", nil, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -382,9 +382,9 @@
 	return
 }
 
-func (__gen_c *clientStubCache) KeyValuePairs(opts ..._gen_ipc.ClientCallOpt) (reply []KeyValuePair, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "KeyValuePairs", nil, opts...); err != nil {
+func (__gen_c *clientStubCache) KeyValuePairs(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply []KeyValuePair, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "KeyValuePairs", nil, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -393,9 +393,9 @@
 	return
 }
 
-func (__gen_c *clientStubCache) MostRecentSet(opts ..._gen_ipc.ClientCallOpt) (value KeyValuePair, time int64, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "MostRecentSet", nil, opts...); err != nil {
+func (__gen_c *clientStubCache) MostRecentSet(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (value KeyValuePair, time int64, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "MostRecentSet", nil, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&value, &time, &err); ierr != nil {
@@ -404,9 +404,9 @@
 	return
 }
 
-func (__gen_c *clientStubCache) KeyPage(index int64, opts ..._gen_ipc.ClientCallOpt) (reply [10]string, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "KeyPage", []interface{}{index}, opts...); err != nil {
+func (__gen_c *clientStubCache) KeyPage(ctx _gen_ipc.Context, index int64, opts ..._gen_ipc.CallOpt) (reply [10]string, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "KeyPage", []interface{}{index}, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -415,9 +415,9 @@
 	return
 }
 
-func (__gen_c *clientStubCache) Size(opts ..._gen_ipc.ClientCallOpt) (reply int64, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "Size", nil, opts...); err != nil {
+func (__gen_c *clientStubCache) Size(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply int64, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "Size", nil, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -426,18 +426,18 @@
 	return
 }
 
-func (__gen_c *clientStubCache) MultiGet(opts ..._gen_ipc.ClientCallOpt) (reply CacheMultiGetStream, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "MultiGet", nil, opts...); err != nil {
+func (__gen_c *clientStubCache) MultiGet(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply CacheMultiGetStream, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "MultiGet", nil, opts...); err != nil {
 		return
 	}
 	reply = &implCacheMultiGetStream{clientCall: call}
 	return
 }
 
-func (__gen_c *clientStubCache) UnresolveStep(opts ..._gen_ipc.ClientCallOpt) (reply []string, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "UnresolveStep", nil, opts...); err != nil {
+func (__gen_c *clientStubCache) UnresolveStep(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply []string, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "UnresolveStep", nil, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -446,9 +446,9 @@
 	return
 }
 
-func (__gen_c *clientStubCache) Signature(opts ..._gen_ipc.ClientCallOpt) (reply _gen_ipc.ServiceSignature, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "Signature", nil, opts...); err != nil {
+func (__gen_c *clientStubCache) Signature(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply _gen_ipc.ServiceSignature, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "Signature", nil, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -457,9 +457,9 @@
 	return
 }
 
-func (__gen_c *clientStubCache) GetMethodTags(method string, opts ..._gen_ipc.ClientCallOpt) (reply []interface{}, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "GetMethodTags", []interface{}{method}, opts...); err != nil {
+func (__gen_c *clientStubCache) GetMethodTags(ctx _gen_ipc.Context, method string, opts ..._gen_ipc.CallOpt) (reply []interface{}, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "GetMethodTags", []interface{}{method}, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
diff --git a/examples/wspr_sample/error_thrower.vdl.go b/examples/wspr_sample/error_thrower.vdl.go
index 5ca7e3e..765ec73 100644
--- a/examples/wspr_sample/error_thrower.vdl.go
+++ b/examples/wspr_sample/error_thrower.vdl.go
@@ -19,25 +19,25 @@
 // to enable embedding without method collisions.  Not to be used directly by clients.
 type ErrorThrower_ExcludingUniversal interface {
 	// Throws veyron2/vError.Aborted error
-	ThrowAborted(opts ..._gen_ipc.ClientCallOpt) (err error)
+	ThrowAborted(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (err error)
 	// Throws veyron2/vError.BadArg error
-	ThrowBadArg(opts ..._gen_ipc.ClientCallOpt) (err error)
+	ThrowBadArg(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (err error)
 	// Throws veyron2/vError.BadProtocol error
-	ThrowBadProtocol(opts ..._gen_ipc.ClientCallOpt) (err error)
+	ThrowBadProtocol(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (err error)
 	// Throws veyron2/vError.Internal error
-	ThrowInternal(opts ..._gen_ipc.ClientCallOpt) (err error)
+	ThrowInternal(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (err error)
 	// Throws veyron2/vError.NotAuthorized error
-	ThrowNotAuthorized(opts ..._gen_ipc.ClientCallOpt) (err error)
+	ThrowNotAuthorized(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (err error)
 	// Throws veyron2/vError.NotFound error
-	ThrowNotFound(opts ..._gen_ipc.ClientCallOpt) (err error)
+	ThrowNotFound(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (err error)
 	// Throws veyron2/vError.Unknown error
-	ThrowUnknown(opts ..._gen_ipc.ClientCallOpt) (err error)
+	ThrowUnknown(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (err error)
 	// Throws normal Go error
-	ThrowGoError(opts ..._gen_ipc.ClientCallOpt) (err error)
+	ThrowGoError(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (err error)
 	// Throws custom error created by using Standard
-	ThrowCustomStandardError(opts ..._gen_ipc.ClientCallOpt) (err error)
+	ThrowCustomStandardError(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (err error)
 	// Lists all errors Ids available in veyron2/verror
-	ListAllBuiltInErrorIDs(opts ..._gen_ipc.ClientCallOpt) (reply []string, err error)
+	ListAllBuiltInErrorIDs(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply []string, err error)
 }
 type ErrorThrower interface {
 	_gen_ipc.UniversalServiceMethods
@@ -48,25 +48,25 @@
 type ErrorThrowerService interface {
 
 	// Throws veyron2/vError.Aborted error
-	ThrowAborted(context _gen_ipc.Context) (err error)
+	ThrowAborted(context _gen_ipc.ServerContext) (err error)
 	// Throws veyron2/vError.BadArg error
-	ThrowBadArg(context _gen_ipc.Context) (err error)
+	ThrowBadArg(context _gen_ipc.ServerContext) (err error)
 	// Throws veyron2/vError.BadProtocol error
-	ThrowBadProtocol(context _gen_ipc.Context) (err error)
+	ThrowBadProtocol(context _gen_ipc.ServerContext) (err error)
 	// Throws veyron2/vError.Internal error
-	ThrowInternal(context _gen_ipc.Context) (err error)
+	ThrowInternal(context _gen_ipc.ServerContext) (err error)
 	// Throws veyron2/vError.NotAuthorized error
-	ThrowNotAuthorized(context _gen_ipc.Context) (err error)
+	ThrowNotAuthorized(context _gen_ipc.ServerContext) (err error)
 	// Throws veyron2/vError.NotFound error
-	ThrowNotFound(context _gen_ipc.Context) (err error)
+	ThrowNotFound(context _gen_ipc.ServerContext) (err error)
 	// Throws veyron2/vError.Unknown error
-	ThrowUnknown(context _gen_ipc.Context) (err error)
+	ThrowUnknown(context _gen_ipc.ServerContext) (err error)
 	// Throws normal Go error
-	ThrowGoError(context _gen_ipc.Context) (err error)
+	ThrowGoError(context _gen_ipc.ServerContext) (err error)
 	// Throws custom error created by using Standard
-	ThrowCustomStandardError(context _gen_ipc.Context) (err error)
+	ThrowCustomStandardError(context _gen_ipc.ServerContext) (err error)
 	// Lists all errors Ids available in veyron2/verror
-	ListAllBuiltInErrorIDs(context _gen_ipc.Context) (reply []string, err error)
+	ListAllBuiltInErrorIDs(context _gen_ipc.ServerContext) (reply []string, err error)
 }
 
 // BindErrorThrower returns the client stub implementing the ErrorThrower
@@ -112,9 +112,9 @@
 	name   string
 }
 
-func (__gen_c *clientStubErrorThrower) ThrowAborted(opts ..._gen_ipc.ClientCallOpt) (err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "ThrowAborted", nil, opts...); err != nil {
+func (__gen_c *clientStubErrorThrower) ThrowAborted(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "ThrowAborted", nil, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&err); ierr != nil {
@@ -123,9 +123,9 @@
 	return
 }
 
-func (__gen_c *clientStubErrorThrower) ThrowBadArg(opts ..._gen_ipc.ClientCallOpt) (err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "ThrowBadArg", nil, opts...); err != nil {
+func (__gen_c *clientStubErrorThrower) ThrowBadArg(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "ThrowBadArg", nil, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&err); ierr != nil {
@@ -134,9 +134,9 @@
 	return
 }
 
-func (__gen_c *clientStubErrorThrower) ThrowBadProtocol(opts ..._gen_ipc.ClientCallOpt) (err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "ThrowBadProtocol", nil, opts...); err != nil {
+func (__gen_c *clientStubErrorThrower) ThrowBadProtocol(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "ThrowBadProtocol", nil, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&err); ierr != nil {
@@ -145,9 +145,9 @@
 	return
 }
 
-func (__gen_c *clientStubErrorThrower) ThrowInternal(opts ..._gen_ipc.ClientCallOpt) (err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "ThrowInternal", nil, opts...); err != nil {
+func (__gen_c *clientStubErrorThrower) ThrowInternal(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "ThrowInternal", nil, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&err); ierr != nil {
@@ -156,9 +156,9 @@
 	return
 }
 
-func (__gen_c *clientStubErrorThrower) ThrowNotAuthorized(opts ..._gen_ipc.ClientCallOpt) (err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "ThrowNotAuthorized", nil, opts...); err != nil {
+func (__gen_c *clientStubErrorThrower) ThrowNotAuthorized(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "ThrowNotAuthorized", nil, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&err); ierr != nil {
@@ -167,9 +167,9 @@
 	return
 }
 
-func (__gen_c *clientStubErrorThrower) ThrowNotFound(opts ..._gen_ipc.ClientCallOpt) (err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "ThrowNotFound", nil, opts...); err != nil {
+func (__gen_c *clientStubErrorThrower) ThrowNotFound(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "ThrowNotFound", nil, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&err); ierr != nil {
@@ -178,9 +178,9 @@
 	return
 }
 
-func (__gen_c *clientStubErrorThrower) ThrowUnknown(opts ..._gen_ipc.ClientCallOpt) (err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "ThrowUnknown", nil, opts...); err != nil {
+func (__gen_c *clientStubErrorThrower) ThrowUnknown(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "ThrowUnknown", nil, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&err); ierr != nil {
@@ -189,9 +189,9 @@
 	return
 }
 
-func (__gen_c *clientStubErrorThrower) ThrowGoError(opts ..._gen_ipc.ClientCallOpt) (err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "ThrowGoError", nil, opts...); err != nil {
+func (__gen_c *clientStubErrorThrower) ThrowGoError(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "ThrowGoError", nil, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&err); ierr != nil {
@@ -200,9 +200,9 @@
 	return
 }
 
-func (__gen_c *clientStubErrorThrower) ThrowCustomStandardError(opts ..._gen_ipc.ClientCallOpt) (err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "ThrowCustomStandardError", nil, opts...); err != nil {
+func (__gen_c *clientStubErrorThrower) ThrowCustomStandardError(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "ThrowCustomStandardError", nil, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&err); ierr != nil {
@@ -211,9 +211,9 @@
 	return
 }
 
-func (__gen_c *clientStubErrorThrower) ListAllBuiltInErrorIDs(opts ..._gen_ipc.ClientCallOpt) (reply []string, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "ListAllBuiltInErrorIDs", nil, opts...); err != nil {
+func (__gen_c *clientStubErrorThrower) ListAllBuiltInErrorIDs(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply []string, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "ListAllBuiltInErrorIDs", nil, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -222,9 +222,9 @@
 	return
 }
 
-func (__gen_c *clientStubErrorThrower) UnresolveStep(opts ..._gen_ipc.ClientCallOpt) (reply []string, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "UnresolveStep", nil, opts...); err != nil {
+func (__gen_c *clientStubErrorThrower) UnresolveStep(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply []string, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "UnresolveStep", nil, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -233,9 +233,9 @@
 	return
 }
 
-func (__gen_c *clientStubErrorThrower) Signature(opts ..._gen_ipc.ClientCallOpt) (reply _gen_ipc.ServiceSignature, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "Signature", nil, opts...); err != nil {
+func (__gen_c *clientStubErrorThrower) Signature(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply _gen_ipc.ServiceSignature, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "Signature", nil, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -244,9 +244,9 @@
 	return
 }
 
-func (__gen_c *clientStubErrorThrower) GetMethodTags(method string, opts ..._gen_ipc.ClientCallOpt) (reply []interface{}, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "GetMethodTags", []interface{}{method}, opts...); err != nil {
+func (__gen_c *clientStubErrorThrower) GetMethodTags(ctx _gen_ipc.Context, method string, opts ..._gen_ipc.CallOpt) (reply []interface{}, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "GetMethodTags", []interface{}{method}, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
diff --git a/examples/wspr_sample/sampled/lib/cache_impl.go b/examples/wspr_sample/sampled/lib/cache_impl.go
index f039400..b2dfeff 100644
--- a/examples/wspr_sample/sampled/lib/cache_impl.go
+++ b/examples/wspr_sample/sampled/lib/cache_impl.go
@@ -29,7 +29,7 @@
 }
 
 // Set sets a value for a key.  This should never return an error.
-func (c *cacheImpl) Set(_ ipc.Context, key string, value vdl.Any) error {
+func (c *cacheImpl) Set(_ ipc.ServerContext, key string, value vdl.Any) error {
 	c.cache[key] = value
 	c.mostRecent = sample.KeyValuePair{Key: key, Value: value}
 	c.lastUpdateTime = time.Now()
@@ -38,7 +38,7 @@
 
 // Get returns the value for a key.  If the key is not in the map, it returns
 // an error.
-func (c *cacheImpl) Get(_ ipc.Context, key string) (vdl.Any, error) {
+func (c *cacheImpl) Get(_ ipc.ServerContext, key string) (vdl.Any, error) {
 	if value, ok := c.cache[key]; ok {
 		return value, nil
 	}
@@ -62,72 +62,72 @@
 }
 
 // Same as Get, but casts the return argument to an int32.
-func (c *cacheImpl) GetAsInt32(_ ipc.Context, key string) (int32, error) {
+func (c *cacheImpl) GetAsInt32(_ ipc.ServerContext, key string) (int32, error) {
 	v, err := c.getWithTypeCheck(key, reflect.TypeOf(int32(0)))
 	return v.(int32), err
 }
 
 // Same as Get, but casts the return argument to an int64.
-func (c *cacheImpl) GetAsInt64(_ ipc.Context, key string) (int64, error) {
+func (c *cacheImpl) GetAsInt64(_ ipc.ServerContext, key string) (int64, error) {
 	v, err := c.getWithTypeCheck(key, reflect.TypeOf(int64(0)))
 	return v.(int64), err
 }
 
 // Same as Get, but casts the return argument to an uint8.
-func (c *cacheImpl) GetAsByte(_ ipc.Context, key string) (byte, error) {
+func (c *cacheImpl) GetAsByte(_ ipc.ServerContext, key string) (byte, error) {
 	v, err := c.getWithTypeCheck(key, reflect.TypeOf(byte(0)))
 	return v.(uint8), err
 }
 
 // Same as Get, but casts the return argument to an uint32.
-func (c *cacheImpl) GetAsUint32(_ ipc.Context, key string) (uint32, error) {
+func (c *cacheImpl) GetAsUint32(_ ipc.ServerContext, key string) (uint32, error) {
 	v, err := c.getWithTypeCheck(key, reflect.TypeOf(uint32(0)))
 	return v.(uint32), err
 }
 
 // Same as Get, but casts the return argument to an uint64.
-func (c *cacheImpl) GetAsUint64(_ ipc.Context, key string) (uint64, error) {
+func (c *cacheImpl) GetAsUint64(_ ipc.ServerContext, key string) (uint64, error) {
 	v, err := c.getWithTypeCheck(key, reflect.TypeOf(uint64(0)))
 	return v.(uint64), err
 }
 
 // Same as Get, but casts the return argument to a float32.
-func (c *cacheImpl) GetAsFloat32(_ ipc.Context, key string) (float32, error) {
+func (c *cacheImpl) GetAsFloat32(_ ipc.ServerContext, key string) (float32, error) {
 	v, err := c.getWithTypeCheck(key, reflect.TypeOf(float32(0)))
 	return v.(float32), err
 }
 
 // Same as Get, but casts the return argument to a float64.
-func (c *cacheImpl) GetAsFloat64(_ ipc.Context, key string) (float64, error) {
+func (c *cacheImpl) GetAsFloat64(_ ipc.ServerContext, key string) (float64, error) {
 	v, err := c.getWithTypeCheck(key, reflect.TypeOf(float64(0)))
 	return v.(float64), err
 }
 
 // Same as Get, but casts the return argument to a string.
-func (c *cacheImpl) GetAsString(_ ipc.Context, key string) (string, error) {
+func (c *cacheImpl) GetAsString(_ ipc.ServerContext, key string) (string, error) {
 	v, err := c.getWithTypeCheck(key, reflect.TypeOf(""))
 	return v.(string), err
 }
 
 // Same as Get, but casts the return argument to a bool.
-func (c *cacheImpl) GetAsBool(_ ipc.Context, key string) (bool, error) {
+func (c *cacheImpl) GetAsBool(_ ipc.ServerContext, key string) (bool, error) {
 	v, err := c.getWithTypeCheck(key, reflect.TypeOf(false))
 	return v.(bool), err
 }
 
 // Same as Get, but converts the string return argument to an error.
-func (c *cacheImpl) GetAsError(_ ipc.Context, key string) (storedError error, callError error) {
+func (c *cacheImpl) GetAsError(_ ipc.ServerContext, key string) (storedError error, callError error) {
 	v, err := c.getWithTypeCheck(key, reflect.TypeOf([]error{}).Elem())
 	return v.(error), err
 }
 
 // AsMap returns the full contents of the cache as a map.
-func (c *cacheImpl) AsMap(ipc.Context) (map[string]vdl.Any, error) {
+func (c *cacheImpl) AsMap(ipc.ServerContext) (map[string]vdl.Any, error) {
 	return c.cache, nil
 }
 
 // KeyValuePairs returns the full contents of the cache as a slice of pairs.
-func (c *cacheImpl) KeyValuePairs(ipc.Context) ([]sample.KeyValuePair, error) {
+func (c *cacheImpl) KeyValuePairs(ipc.ServerContext) ([]sample.KeyValuePair, error) {
 	kvp := make([]sample.KeyValuePair, 0, len(c.cache))
 	for key, val := range c.cache {
 		kvp = append(kvp, sample.KeyValuePair{key, val})
@@ -138,7 +138,7 @@
 // MostRecentSet returns the key and value and the timestamp for the most
 // recent set operation
 // TODO(bprosnitz) support type types and change time to native time type
-func (c *cacheImpl) MostRecentSet(ipc.Context) (sample.KeyValuePair, int64, error) {
+func (c *cacheImpl) MostRecentSet(ipc.ServerContext) (sample.KeyValuePair, int64, error) {
 	var err error
 	if c.lastUpdateTime.IsZero() {
 		err = verror.NotFoundf("no values in the cache so cannot return most recent.")
@@ -148,7 +148,7 @@
 
 // KeyPage indexes into the keys (in alphanumerically sorted order) and
 // returns the indexth page of 10 keys.
-func (c *cacheImpl) KeyPage(_ ipc.Context, index int64) ([10]string, error) {
+func (c *cacheImpl) KeyPage(_ ipc.ServerContext, index int64) ([10]string, error) {
 	results := [10]string{}
 
 	keys := sort.StringSlice{}
@@ -174,14 +174,14 @@
 }
 
 // Size returns the total number of entries in the cache.
-func (c *cacheImpl) Size(ipc.Context) (int64, error) {
+func (c *cacheImpl) Size(ipc.ServerContext) (int64, error) {
 	return int64(len(c.cache)), nil
 }
 
 // MultiGet handles a stream of get requests.  Returns an error if one of the
 // keys in the stream is not in the map or if there was an issue reading
 // the stream.
-func (c *cacheImpl) MultiGet(_ ipc.Context, stream sample.CacheServiceMultiGetStream) error {
+func (c *cacheImpl) MultiGet(_ ipc.ServerContext, stream sample.CacheServiceMultiGetStream) error {
 	for {
 		key, err := stream.Recv()
 		if err == io.EOF {
diff --git a/examples/wspr_sample/sampled/lib/error_thrower_impl.go b/examples/wspr_sample/sampled/lib/error_thrower_impl.go
index 3ad7e68..e352b62 100644
--- a/examples/wspr_sample/sampled/lib/error_thrower_impl.go
+++ b/examples/wspr_sample/sampled/lib/error_thrower_impl.go
@@ -16,46 +16,46 @@
 
 type errorThrowerImpl struct{}
 
-func (e *errorThrowerImpl) ThrowAborted(_ ipc.Context) error {
+func (e *errorThrowerImpl) ThrowAborted(_ ipc.ServerContext) error {
 	return verror.Abortedf("Aborted!")
 }
 
-func (e *errorThrowerImpl) ThrowBadArg(_ ipc.Context) error {
+func (e *errorThrowerImpl) ThrowBadArg(_ ipc.ServerContext) error {
 	return verror.BadArgf("BadArg!")
 }
 
-func (e *errorThrowerImpl) ThrowBadProtocol(_ ipc.Context) error {
+func (e *errorThrowerImpl) ThrowBadProtocol(_ ipc.ServerContext) error {
 	return verror.BadProtocolf("BadProtocol!")
 }
 
-func (e *errorThrowerImpl) ThrowInternal(_ ipc.Context) error {
+func (e *errorThrowerImpl) ThrowInternal(_ ipc.ServerContext) error {
 	return verror.Internalf("Internal!")
 }
 
-func (e *errorThrowerImpl) ThrowNotAuthorized(_ ipc.Context) error {
+func (e *errorThrowerImpl) ThrowNotAuthorized(_ ipc.ServerContext) error {
 	return verror.NotAuthorizedf("NotAuthorized!")
 }
 
-func (e *errorThrowerImpl) ThrowNotFound(_ ipc.Context) error {
+func (e *errorThrowerImpl) ThrowNotFound(_ ipc.ServerContext) error {
 	return verror.NotFoundf("NotFound!")
 }
 
-func (e *errorThrowerImpl) ThrowUnknown(_ ipc.Context) error {
+func (e *errorThrowerImpl) ThrowUnknown(_ ipc.ServerContext) error {
 	return verror.Unknownf("Unknown!")
 }
 
-func (e *errorThrowerImpl) ThrowGoError(_ ipc.Context) error {
+func (e *errorThrowerImpl) ThrowGoError(_ ipc.ServerContext) error {
 	return errors.New("GoError!")
 }
 
-func (e *errorThrowerImpl) ThrowCustomStandardError(_ ipc.Context) error {
+func (e *errorThrowerImpl) ThrowCustomStandardError(_ ipc.ServerContext) error {
 	return verror.Standard{
 		ID:  "MyCustomError",
 		Msg: "CustomStandard!",
 	}
 }
 
-func (e *errorThrowerImpl) ListAllBuiltInErrorIDs(_ ipc.Context) ([]string, error) {
+func (e *errorThrowerImpl) ListAllBuiltInErrorIDs(_ ipc.ServerContext) ([]string, error) {
 	// TODO(aghassemi) Use when we have enum for error IDs in IDL
 	// This is not used yet but the idea is to pass all error types in veyron2/verror to
 	// JavaScript so if a new one is added, this test would break and we add the new one to
diff --git a/examples/wspr_sample/sampled/lib/sampled_test.go b/examples/wspr_sample/sampled/lib/sampled_test.go
index 6b51edb..9ee0d18 100644
--- a/examples/wspr_sample/sampled/lib/sampled_test.go
+++ b/examples/wspr_sample/sampled/lib/sampled_test.go
@@ -57,6 +57,7 @@
 		testCase{"err_string", "GetAsString", true, true},
 	}
 	r := rt.Init()
+	ctx := r.NewContext()
 
 	s, endpoint, err := StartServer(r)
 	if err != nil {
@@ -69,13 +70,13 @@
 	}
 	for _, test := range tests {
 		// Call Set().
-		if err := c.Set(test.mapFieldName, test.v); err != nil {
+		if err := c.Set(ctx, test.mapFieldName, test.v); err != nil {
 			t.Errorf("error setting: %v (test case: %v)", err, test)
 			continue
 		}
 
 		meth := reflect.ValueOf(c).MethodByName(test.nameOfGetMethod)
-		out := meth.Call([]reflect.Value{reflect.ValueOf(test.mapFieldName)})
+		out := meth.Call([]reflect.Value{reflect.ValueOf(ctx), reflect.ValueOf(test.mapFieldName)})
 		if !test.shouldGetError {
 			if out[1].Interface() != nil {
 				t.Errorf("error getting: %v (test case: %v)", err, test)
@@ -93,52 +94,52 @@
 
 // settable mirrors the cache's Set method to provide a consistent way to populate test cases.
 type settable interface {
-	Set(key string, val vdl.Any, opts ...ipc.ClientCallOpt) error
+	Set(ctx ipc.Context, key string, val vdl.Any, opts ...ipc.CallOpt) error
 }
 
 // populateObject populates a settable with 12 values.
-func populateObject(s settable) error {
-	if err := s.Set("A", int8(3)); err != nil {
+func populateObject(ctx ipc.Context, s settable) error {
+	if err := s.Set(ctx, "A", int8(3)); err != nil {
 		return err
 	}
 	// Set "A" again to ensure it takes the second value.
-	if err := s.Set("A", "A"); err != nil {
+	if err := s.Set(ctx, "A", "A"); err != nil {
 		return err
 	}
-	if err := s.Set("B", uint16(5)); err != nil {
+	if err := s.Set(ctx, "B", uint16(5)); err != nil {
 		return err
 	}
-	if err := s.Set("C", uint32(7)); err != nil {
+	if err := s.Set(ctx, "C", uint32(7)); err != nil {
 		return err
 	}
-	if err := s.Set("D", verror.ToStandard(errors.New("Err"))); err != nil {
+	if err := s.Set(ctx, "D", verror.ToStandard(errors.New("Err"))); err != nil {
 		return err
 	}
-	if err := s.Set("E", true); err != nil {
+	if err := s.Set(ctx, "E", true); err != nil {
 		return err
 	}
-	if err := s.Set("F", float32(5.4)); err != nil {
+	if err := s.Set(ctx, "F", float32(5.4)); err != nil {
 		return err
 	}
-	if err := s.Set("G", struct {
+	if err := s.Set(ctx, "G", struct {
 		X int
 		Y string
 	}{4, "G"}); err != nil {
 		return err
 	}
-	if err := s.Set("H", uint64(8)); err != nil {
+	if err := s.Set(ctx, "H", uint64(8)); err != nil {
 		return err
 	}
-	if err := s.Set("I", "I"); err != nil {
+	if err := s.Set(ctx, "I", "I"); err != nil {
 		return err
 	}
-	if err := s.Set("J", float64(8.3)); err != nil {
+	if err := s.Set(ctx, "J", float64(8.3)); err != nil {
 		return err
 	}
-	if err := s.Set("K", int64(2)); err != nil {
+	if err := s.Set(ctx, "K", int64(2)); err != nil {
 		return err
 	}
-	if err := s.Set("L", int8(9)); err != nil {
+	if err := s.Set(ctx, "L", int8(9)); err != nil {
 		return err
 	}
 	return nil
@@ -156,7 +157,7 @@
 		t.Fatal("failed to connect client: ", err)
 	}
 
-	if err := populateObject(c.(settable)); err != nil {
+	if err := populateObject(r.NewContext(), c.(settable)); err != nil {
 		t.Fatal("error populating cache: ", err)
 	}
 
@@ -166,7 +167,7 @@
 // settableMap is a map that implements the settable interface.
 type settableMap map[string]vdl.Any
 
-func (sm settableMap) Set(key string, val vdl.Any, opts ...ipc.ClientCallOpt) error {
+func (sm settableMap) Set(ctx ipc.Context, key string, val vdl.Any, opts ...ipc.CallOpt) error {
 	sm[key] = val
 	return nil
 }
@@ -176,13 +177,15 @@
 	c, s := setupManyResults(t)
 	defer s.Stop()
 
-	res, err := c.AsMap()
+	ctx := rt.R().NewContext()
+
+	res, err := c.AsMap(ctx)
 	if err != nil {
 		t.Fatal("error calling AsMap: ", err)
 	}
 
 	m := settableMap(make(map[string]vdl.Any))
-	if err := populateObject(m); err != nil {
+	if err := populateObject(ctx, m); err != nil {
 		t.Fatal("error populating map: ", err)
 	}
 
@@ -199,13 +202,14 @@
 	c, s := setupManyResults(t)
 	defer s.Stop()
 
-	res, err := c.KeyValuePairs()
+	ctx := rt.R().NewContext()
+	res, err := c.KeyValuePairs(ctx)
 	if err != nil {
 		t.Fatal("error calling KeyValuePairs: ", err)
 	}
 
 	m := settableMap(make(map[string]vdl.Any))
-	if err := populateObject(m); err != nil {
+	if err := populateObject(ctx, m); err != nil {
 		t.Fatal("error populating map: ", err)
 	}
 
@@ -222,7 +226,8 @@
 	c, s := setupManyResults(t)
 	defer s.Stop()
 
-	sz, err := c.Size()
+	ctx := rt.R().NewContext()
+	sz, err := c.Size(ctx)
 	if err != nil {
 		t.Fatal("error calling Size: ", err)
 	}
@@ -230,7 +235,7 @@
 		t.Fatal("wrong number of results: ", sz)
 	}
 
-	res, err := c.KeyPage(1)
+	res, err := c.KeyPage(ctx, 1)
 	if err != nil {
 		t.Fatal("error calling AsMap: ", err)
 	}
@@ -245,13 +250,15 @@
 	c, s := setupManyResults(t)
 	defer s.Stop()
 
+	ctx := rt.R().NewContext()
+
 	timeBefore := time.Now().Unix()
-	if err := c.Set("B", int32(8)); err != nil {
+	if err := c.Set(ctx, "B", int32(8)); err != nil {
 		t.Fatal("error calling Set: ", err)
 	}
 	timeAfter := time.Now().Unix()
 
-	kvp, setTime, err := c.MostRecentSet()
+	kvp, setTime, err := c.MostRecentSet(ctx)
 	if err != nil {
 		t.Fatal("error calling MostRecentSet: ", err)
 	}
@@ -270,7 +277,7 @@
 	c, s := setupManyResults(t)
 	defer s.Stop()
 
-	stream, err := c.MultiGet()
+	stream, err := c.MultiGet(rt.R().NewContext())
 	if err != nil {
 		t.Fatal("error calling MultiGet: ", err)
 	}
diff --git a/lib/exec/child.go b/lib/exec/child.go
index f200751..2353664 100644
--- a/lib/exec/child.go
+++ b/lib/exec/child.go
@@ -5,6 +5,7 @@
 	"errors"
 	"io"
 	"os"
+	"sync"
 )
 
 var (
@@ -33,52 +34,33 @@
 	statusPipe *os.File
 }
 
+var (
+	childHandle    *ChildHandle
+	childHandleErr error
+	once           sync.Once
+)
+
 // fileOffset accounts for the file descriptors that are always passed
 // to the child by the parent: stderr, stdin, stdout, data read, and
 // status write. Any extra files added by the client will follow
 // fileOffset.
 const fileOffset = 5
 
-// NewChildHandle creates a new ChildHandle that can be used to signal
-// that the child is 'ready' (by calling SetReady) to its parent. The
-// value of the ChildHandle's Secret securely passed to it by the
-// parent; this is intended for subsequent use to create a secure
-// communication channels and or authentication.
+// GetChildHandle returns a ChildHandle that can be used to signal
+// that the child is 'ready' (by calling SetReady) to its parent or to
+// retrieve data securely passed to this process by its parent. For
+// instance, a secret intended to create a secure communication
+// channels and or authentication.
 //
 // If the child is relying on exec.Cmd.ExtraFiles then its first file
 // descriptor will not be 3, but will be offset by extra files added
 // by the framework. The developer should use the NewExtraFile method
 // to robustly get their extra files with the correct offset applied.
-func NewChildHandle() (*ChildHandle, error) {
-	switch os.Getenv(versionVariable) {
-	case "":
-		return nil, ErrNoVersion
-	case version1:
-		// TODO(cnicolaou): need to use major.minor.build format for
-		// version #s.
-	default:
-		return nil, ErrUnsupportedVersion
-	}
-	dataPipe := os.NewFile(3, "data_rd")
-	endpoint, err := readData(dataPipe)
-	if err != nil {
-		return nil, err
-	}
-	id, err := readData(dataPipe)
-	if err != nil {
-		return nil, err
-	}
-	secret, err := readData(dataPipe)
-	if err != nil {
-		return nil, err
-	}
-	c := &ChildHandle{
-		Endpoint:   endpoint,
-		ID:         id,
-		Secret:     secret,
-		statusPipe: os.NewFile(4, "status_wr"),
-	}
-	return c, nil
+func GetChildHandle() (*ChildHandle, error) {
+	once.Do(func() {
+		childHandle, childHandleErr = createChildHandle()
+	})
+	return childHandle, childHandleErr
 }
 
 // SetReady writes a 'ready' status to its parent.
@@ -95,7 +77,39 @@
 	return os.NewFile(i+fileOffset, name)
 }
 
-func readData(r io.Reader) (string, error) {
+func createChildHandle() (*ChildHandle, error) {
+	switch os.Getenv(versionVariable) {
+	case "":
+		return nil, ErrNoVersion
+	case version1:
+		// TODO(cnicolaou): need to use major.minor.build format for
+		// version #s.
+	default:
+		return nil, ErrUnsupportedVersion
+	}
+	dataPipe := os.NewFile(3, "data_rd")
+	endpoint, err := decodeString(dataPipe)
+	if err != nil {
+		return nil, err
+	}
+	id, err := decodeString(dataPipe)
+	if err != nil {
+		return nil, err
+	}
+	secret, err := decodeString(dataPipe)
+	if err != nil {
+		return nil, err
+	}
+	childHandle = &ChildHandle{
+		Endpoint:   endpoint,
+		ID:         id,
+		Secret:     secret,
+		statusPipe: os.NewFile(4, "status_wr"),
+	}
+	return childHandle, nil
+}
+
+func decodeString(r io.Reader) (string, error) {
 	var l int64 = 0
 	if err := binary.Read(r, binary.BigEndian, &l); err != nil {
 		return "", err
diff --git a/lib/exec/example_test.go b/lib/exec/example_test.go
index e5eeb5a..c66adcc 100644
--- a/lib/exec/example_test.go
+++ b/lib/exec/example_test.go
@@ -7,7 +7,7 @@
 )
 
 func ExampleChildHandle() {
-	ch, _ := NewChildHandle()
+	ch, _ := GetChildHandle()
 	// Initalize the app/service, access the secret shared with the
 	// child by its parent
 	_ = ch.Secret
diff --git a/lib/exec/exec_test.go b/lib/exec/exec_test.go
index 4da8b5b..2e4c143 100644
--- a/lib/exec/exec_test.go
+++ b/lib/exec/exec_test.go
@@ -155,7 +155,7 @@
 
 func TestNoVersion(t *testing.T) {
 	// Make sure that Init correctly tests for the presence of VEXEC_VERSION
-	_, err := vexec.NewChildHandle()
+	_, err := vexec.GetChildHandle()
 	if err != vexec.ErrNoVersion {
 		t.Errorf("Should be missing Version")
 	}
@@ -424,13 +424,13 @@
 
 	switch cmd {
 	case "testNeverReady":
-		_, err := vexec.NewChildHandle()
+		_, err := vexec.GetChildHandle()
 		if err != nil {
 			log.Fatal(os.Stderr, "%s\n", err)
 		}
 		fmt.Fprintf(os.Stderr, "never ready")
 	case "testTooSlowToReady":
-		ch, err := vexec.NewChildHandle()
+		ch, err := vexec.GetChildHandle()
 		if err != nil {
 			log.Fatal(os.Stderr, "%s\n", err)
 		}
@@ -455,14 +455,14 @@
 		}
 		os.Exit(0)
 	case "testReady":
-		ch, err := vexec.NewChildHandle()
+		ch, err := vexec.GetChildHandle()
 		if err != nil {
 			log.Fatal(os.Stderr, "%s", err)
 		}
 		ch.SetReady()
 		fmt.Fprintf(os.Stderr, ".")
 	case "testReadySlow":
-		ch, err := vexec.NewChildHandle()
+		ch, err := vexec.GetChildHandle()
 		if err != nil {
 			log.Fatal(os.Stderr, "%s", err)
 		}
@@ -481,7 +481,7 @@
 		ch.SetReady()
 		fmt.Fprintf(os.Stderr, "..")
 	case "testSuccess", "testError":
-		ch, err := vexec.NewChildHandle()
+		ch, err := vexec.GetChildHandle()
 		if err != nil {
 			log.Fatal(os.Stderr, "%s\n", err)
 		}
@@ -499,28 +499,28 @@
 		r := <-rc
 		os.Exit(r)
 	case "testEndpoint":
-		ch, err := vexec.NewChildHandle()
+		ch, err := vexec.GetChildHandle()
 		if err != nil {
 			log.Fatalf("%v", err)
 		} else {
 			fmt.Fprintf(os.Stderr, "%s", ch.Endpoint)
 		}
 	case "testID":
-		ch, err := vexec.NewChildHandle()
+		ch, err := vexec.GetChildHandle()
 		if err != nil {
 			log.Fatalf("%s", err)
 		} else {
 			fmt.Fprintf(os.Stderr, "%s", ch.ID)
 		}
 	case "testSecret":
-		ch, err := vexec.NewChildHandle()
+		ch, err := vexec.GetChildHandle()
 		if err != nil {
 			log.Fatalf("%s", err)
 		} else {
 			fmt.Fprintf(os.Stderr, "%s", ch.Secret)
 		}
 	case "testExtraFiles":
-		ch, err := vexec.NewChildHandle()
+		ch, err := vexec.GetChildHandle()
 		if err != nil {
 			log.Fatal("error.... %s\n", err)
 		}
diff --git a/lib/exec/parent.go b/lib/exec/parent.go
index 2a77924..b2789fc 100644
--- a/lib/exec/parent.go
+++ b/lib/exec/parent.go
@@ -137,17 +137,17 @@
 		return err
 	}
 	// Pass data to the child using a pipe.
-	if err := writeData(dataWrite, p.endpoint); err != nil {
+	if err := encodeString(dataWrite, p.endpoint); err != nil {
 		p.statusWrite.Close()
 		p.statusRead.Close()
 		return err
 	}
-	if err := writeData(dataWrite, p.id); err != nil {
+	if err := encodeString(dataWrite, p.id); err != nil {
 		p.statusWrite.Close()
 		p.statusRead.Close()
 		return err
 	}
-	if err := writeData(dataWrite, p.secret); err != nil {
+	if err := encodeString(dataWrite, p.secret); err != nil {
 		p.statusWrite.Close()
 		p.statusRead.Close()
 		return err
@@ -250,7 +250,7 @@
 	return p.c.Wait()
 }
 
-func writeData(w io.Writer, data string) error {
+func encodeString(w io.Writer, data string) error {
 	l := len(data)
 	if err := binary.Write(w, binary.BigEndian, int64(l)); err != nil {
 		return err
diff --git a/lib/testutil/blackbox/subprocess.go b/lib/testutil/blackbox/subprocess.go
index 06b9c51..116b51f 100644
--- a/lib/testutil/blackbox/subprocess.go
+++ b/lib/testutil/blackbox/subprocess.go
@@ -145,7 +145,7 @@
 		// If this process was started using the veyron exec library
 		// we have to use NewExtraFile below to get at the correct
 		// offset for the fd.
-		ch, err := vexec.NewChildHandle()
+		ch, err := vexec.GetChildHandle()
 		if err != nil {
 			vlog.Fatalf("Failed to init child handle: %v", err)
 		}
diff --git a/runtimes/google/ipc/client.go b/runtimes/google/ipc/client.go
index f1dbeb5..16a711c 100644
--- a/runtimes/google/ipc/client.go
+++ b/runtimes/google/ipc/client.go
@@ -114,12 +114,12 @@
 	return flow, suffix, nil
 }
 
-func (c *client) StartCall(name, method string, args []interface{}, opts ...ipc.ClientCallOpt) (ipc.ClientCall, error) {
+func (c *client) StartCall(ctx ipc.Context, name, method string, args []interface{}, opts ...ipc.CallOpt) (ipc.Call, error) {
 	return c.startCall(name, method, args, opts...)
 }
 
 // startCall ensures StartCall always returns verror.E.
-func (c *client) startCall(name, method string, args []interface{}, opts ...ipc.ClientCallOpt) (ipc.ClientCall, verror.E) {
+func (c *client) startCall(name, method string, args []interface{}, opts ...ipc.CallOpt) (ipc.Call, verror.E) {
 	servers, err := c.mt.Resolve(name)
 	if err != nil {
 		return nil, verror.NotFoundf("ipc: Resolve(%q) failed: %v", name, err)
@@ -177,7 +177,7 @@
 	return nil, errNoServers
 }
 
-func (c *client) getCallTimeout(opts []ipc.ClientCallOpt) time.Duration {
+func (c *client) getCallTimeout(opts []ipc.CallOpt) time.Duration {
 	timeout := c.callTimeout
 	for _, opt := range opts {
 		if ct, ok := opt.(veyron2.CallTimeout); ok {
@@ -358,7 +358,7 @@
 	fc.flow.Cancel()
 }
 
-func matchServerID(id security.PublicID, opts []ipc.ClientCallOpt) verror.E {
+func matchServerID(id security.PublicID, opts []ipc.CallOpt) verror.E {
 	for _, opt := range opts {
 		if pattern, ok := opt.(veyron2.RemoteID); ok && !id.Match(security.PrincipalPattern(pattern)) {
 			return verror.NotAuthorizedf("ipc: server identity %q does not have a name matching the provided pattern %q", id, pattern)
diff --git a/runtimes/google/ipc/context.go b/runtimes/google/ipc/context.go
new file mode 100644
index 0000000..561886d
--- /dev/null
+++ b/runtimes/google/ipc/context.go
@@ -0,0 +1,14 @@
+package ipc
+
+import (
+	"veyron2/ipc"
+)
+
+// context implements the ipc.ServerContext interface.
+type context struct{}
+
+// InternalNewContext creates a new ipc.Context.  This function should only
+// be called from within the runtime implementation.
+func InternalNewContext() ipc.Context {
+	return &context{}
+}
diff --git a/runtimes/google/ipc/full_test.go b/runtimes/google/ipc/full_test.go
index 941f6bd..4b53246 100644
--- a/runtimes/google/ipc/full_test.go
+++ b/runtimes/google/ipc/full_test.go
@@ -38,6 +38,8 @@
 
 var errAuthorizer = errors.New("ipc: application Authorizer denied access")
 
+type fakeContext struct{}
+
 type userType string
 
 type testServer struct{}
@@ -192,6 +194,11 @@
 	return nil, nil
 }
 
+func (mt *mountTable) SetRoots([]string) error {
+	panic("SetRoots not implemented")
+	return nil
+}
+
 func startServer(t *testing.T, serverID security.PrivateID, sm stream.Manager, mt naming.MountTable, ts interface{}) ipc.Server {
 	vlog.VI(1).Info("InternalNewServer")
 	server, err := InternalNewServer(sm, mt, veyron2.LocalID(serverID))
@@ -343,7 +350,7 @@
 			stopServer(t, server, mt)
 			continue
 		}
-		if _, err := client.StartCall("mountpoint/server/suffix", "irrelevant", nil, veyron2.RemoteID(test.pattern)); !matchesErrorPattern(err, test.err) {
+		if _, err := client.StartCall(&fakeContext{}, "mountpoint/server/suffix", "irrelevant", nil, veyron2.RemoteID(test.pattern)); !matchesErrorPattern(err, test.err) {
 			t.Errorf(`%s: client.StartCall: got error "%v", want to match "%v"`, name, err, test.err)
 		}
 		client.Close()
@@ -394,7 +401,7 @@
 	defer b.cleanup(t)
 	for _, test := range tests {
 		vlog.VI(1).Infof("%s client.StartCall", name(test))
-		call, err := b.client.StartCall(test.name, test.method, test.args)
+		call, err := b.client.StartCall(&fakeContext{}, test.name, test.method, test.args)
 		if err != test.startErr {
 			t.Errorf(`%s client.StartCall got error "%v", want "%v"`, name(test), err, test.startErr)
 			continue
@@ -506,7 +513,7 @@
 			t.Fatalf("InternalNewClient failed: %v", err)
 		}
 		defer client.Close()
-		call, err := client.StartCall(test.name, test.method, test.args)
+		call, err := client.StartCall(&fakeContext{}, test.name, test.method, test.args)
 		if err != nil {
 			t.Errorf(`%s client.StartCall got unexpected error: "%v"`, name(test), err)
 			continue
@@ -562,7 +569,7 @@
 	}
 }
 
-func waitForCancel(t *testing.T, ts *cancelTestServer, call ipc.ClientCall) {
+func waitForCancel(t *testing.T, ts *cancelTestServer, call ipc.Call) {
 	<-ts.started
 	call.Cancel()
 	<-ts.cancelled
@@ -574,7 +581,7 @@
 	b := createBundle(t, clientID, serverID, ts)
 	defer b.cleanup(t)
 
-	call, err := b.client.StartCall("mountpoint/server/suffix", "CancelStreamReader", []interface{}{})
+	call, err := b.client.StartCall(&fakeContext{}, "mountpoint/server/suffix", "CancelStreamReader", []interface{}{})
 	if err != nil {
 		t.Fatalf("Start call failed: %v", err)
 	}
@@ -594,7 +601,7 @@
 	b := createBundle(t, clientID, serverID, ts)
 	defer b.cleanup(t)
 
-	call, err := b.client.StartCall("mountpoint/server/suffix", "CancelStreamIgnorer", []interface{}{})
+	call, err := b.client.StartCall(&fakeContext{}, "mountpoint/server/suffix", "CancelStreamIgnorer", []interface{}{})
 	if err != nil {
 		t.Fatalf("Start call failed: %v", err)
 	}
@@ -630,7 +637,7 @@
 	b := createBundle(t, clientID, serverID, s)
 	defer b.cleanup(t)
 
-	call, err := b.client.StartCall("mountpoint/server/suffix", "RecvInGoroutine", []interface{}{})
+	call, err := b.client.StartCall(&fakeContext{}, "mountpoint/server/suffix", "RecvInGoroutine", []interface{}{})
 	if err != nil {
 		t.Fatalf("StartCall failed: %v", err)
 	}
@@ -670,7 +677,7 @@
 	publisher.AddServer("/@2@tcp@localhost:10000@@1000000@2000000@@")
 	publisher.AddServer("/@2@tcp@localhost:10001@@2000000@3000000@@")
 
-	_, err := b.client.StartCall("incompatible/server/suffix", "Echo", []interface{}{"foo"})
+	_, err := b.client.StartCall(&fakeContext{}, "incompatible/server/suffix", "Echo", []interface{}{"foo"})
 	if !strings.Contains(err.Error(), version.NoCompatibleVersionErr.Error()) {
 		t.Errorf("Expected error %v, found: %v", version.NoCompatibleVersionErr, err)
 	}
@@ -678,7 +685,7 @@
 	// Now add a server with a compatible endpoint and try again.
 	b.server.Publish("incompatible")
 
-	call, err := b.client.StartCall("incompatible/server/suffix", "Echo", []interface{}{"foo"})
+	call, err := b.client.StartCall(&fakeContext{}, "incompatible/server/suffix", "Echo", []interface{}{"foo"})
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -775,7 +782,7 @@
 	}
 	serverName := naming.JoinAddressName(ep.String(), "server/suffix")
 	makeCall := func() (string, error) {
-		call, err := b.client.StartCall(serverName, "Echo", []interface{}{"bratman"})
+		call, err := b.client.StartCall(&fakeContext{}, serverName, "Echo", []interface{}{"bratman"})
 		if err != nil {
 			return "", err
 		}
diff --git a/runtimes/google/ipc/jni/arg_getter.go b/runtimes/google/ipc/jni/arg_getter.go
index d704016..25c2003 100644
--- a/runtimes/google/ipc/jni/arg_getter.go
+++ b/runtimes/google/ipc/jni/arg_getter.go
@@ -40,8 +40,8 @@
 		m := t.Method(i)
 		in := make([]reflect.Type, m.Type.NumIn()-1)
 		idx := 0
-		contextType := reflect.TypeOf((*ipc.Context)(nil)).Elem()
-		optType := reflect.TypeOf((*ipc.ClientCallOpt)(nil)).Elem()
+		contextType := reflect.TypeOf((*ipc.ServerContext)(nil)).Elem()
+		optType := reflect.TypeOf((*ipc.CallOpt)(nil)).Elem()
 		for j := 0; j < m.Type.NumIn(); j++ {
 			argType := m.Type.In(j)
 			if j == 0 && argType == contextType { // skip the Context argument.
diff --git a/runtimes/google/ipc/jni/client.go b/runtimes/google/ipc/jni/client.go
index b7881d7..10e4474 100644
--- a/runtimes/google/ipc/jni/client.go
+++ b/runtimes/google/ipc/jni/client.go
@@ -59,7 +59,7 @@
 		args[i] = derefOrDie(argptrs[i])
 	}
 	// Process options.
-	options := []ipc.ClientCallOpt{}
+	options := []ipc.CallOpt{}
 	if int(jTimeout) >= 0 {
 		options = append(options, veyron2.CallTimeout(time.Duration(int(jTimeout))*time.Millisecond))
 	}
@@ -83,7 +83,7 @@
 }
 
 type clientCall struct {
-	call       ipc.ClientCall
+	call       ipc.Call
 	resultptrs []interface{}
 }
 
diff --git a/runtimes/google/ipc/jni/jni.go b/runtimes/google/ipc/jni/jni.go
index d20b2bc..1fb6a61 100644
--- a/runtimes/google/ipc/jni/jni.go
+++ b/runtimes/google/ipc/jni/jni.go
@@ -70,9 +70,9 @@
 	return C.jlong(uintptr(unsafe.Pointer(c)))
 }
 
-// getClientCall returns the clientCall referenced by the provided pointer,
+// getCall returns the clientCall referenced by the provided pointer,
 // or nil if the pointer is 0.
-func getClientCall(env *C.JNIEnv, ptr C.jlong) *clientCall {
+func getCall(env *C.JNIEnv, ptr C.jlong) *clientCall {
 	if ptr == C.jlong(0) {
 		jThrow(env, "Go client call pointer is nil")
 		return nil
@@ -219,11 +219,11 @@
 	}
 }
 
-//export Java_com_veyron_runtimes_google_ipc_Runtime_00024ClientCall_nativeFinish
-func Java_com_veyron_runtimes_google_ipc_Runtime_00024ClientCall_nativeFinish(env *C.JNIEnv, jClient C.jobject, goClientCallPtr C.jlong) C.jobjectArray {
-	c := getClientCall(env, goClientCallPtr)
+//export Java_com_veyron_runtimes_google_ipc_Runtime_00024Call_nativeFinish
+func Java_com_veyron_runtimes_google_ipc_Runtime_00024Call_nativeFinish(env *C.JNIEnv, jClient C.jobject, goCallPtr C.jlong) C.jobjectArray {
+	c := getCall(env, goCallPtr)
 	if c == nil {
-		jThrow(env, fmt.Sprintf("Couldn't find Go client with pointer: %d", int(goClientCallPtr)))
+		jThrow(env, fmt.Sprintf("Couldn't find Go client with pointer: %d", int(goCallPtr)))
 		return nil
 	}
 	ret, err := c.Finish(env)
@@ -237,17 +237,17 @@
 	return ret
 }
 
-//export Java_com_veyron_runtimes_google_ipc_Runtime_00024ClientCall_nativeCancel
-func Java_com_veyron_runtimes_google_ipc_Runtime_00024ClientCall_nativeCancel(env *C.JNIEnv, jClient C.jobject, goClientCallPtr C.jlong) {
-	c := getClientCall(env, goClientCallPtr)
+//export Java_com_veyron_runtimes_google_ipc_Runtime_00024Call_nativeCancel
+func Java_com_veyron_runtimes_google_ipc_Runtime_00024Call_nativeCancel(env *C.JNIEnv, jClient C.jobject, goCallPtr C.jlong) {
+	c := getCall(env, goCallPtr)
 	if c != nil {
 		c.Cancel()
 	}
 }
 
-//export Java_com_veyron_runtimes_google_ipc_Runtime_00024ClientCall_nativeFinalize
-func Java_com_veyron_runtimes_google_ipc_Runtime_00024ClientCall_nativeFinalize(env *C.JNIEnv, jClient C.jobject, goClientCallPtr C.jlong) {
-	c := getClientCall(env, goClientCallPtr)
+//export Java_com_veyron_runtimes_google_ipc_Runtime_00024Call_nativeFinalize
+func Java_com_veyron_runtimes_google_ipc_Runtime_00024Call_nativeFinalize(env *C.JNIEnv, jClient C.jobject, goCallPtr C.jlong) {
+	c := getCall(env, goCallPtr)
 	if c != nil {
 		refs.delete(c)
 	}
diff --git a/runtimes/google/ipc/server.go b/runtimes/google/ipc/server.go
index 13944d3..02a6924 100644
--- a/runtimes/google/ipc/server.go
+++ b/runtimes/google/ipc/server.go
@@ -23,8 +23,6 @@
 )
 
 var (
-	errNoDispatcher  = verror.NotFoundf("ipc: dispatcher not found")
-	errWrongNumArgs  = verror.BadProtocolf("ipc: wrong number of input arguments")
 	errServerStopped = verror.Abortedf("ipc: server is stopped")
 )
 
@@ -34,15 +32,16 @@
 
 type server struct {
 	sync.Mutex
-	streamMgr    stream.Manager       // stream manager to listen for new flows.
-	disptrie     *disptrie            // dispatch trie for method dispatching.
-	publisher    Publisher            // publisher to publish mounttable mounts.
-	listenerOpts []stream.ListenerOpt // listener opts passed to Listen.
-	listeners    []stream.Listener    // listeners created by Listen.
-	active       sync.WaitGroup       // active goroutines we've spawned.
-	stopped      bool                 // whether the server has been stopped.
-	mt           naming.MountTable
-	publishOpt   veyron2.ServerPublishOpt // which endpoints to publish
+	streamMgr        stream.Manager       // stream manager to listen for new flows.
+	disptrie         *disptrie            // dispatch trie for method dispatching.
+	publisher        Publisher            // publisher to publish mounttable mounts.
+	listenerOpts     []stream.ListenerOpt // listener opts passed to Listen.
+	listeners        []stream.Listener    // listeners created by Listen.
+	active           sync.WaitGroup       // active goroutines we've spawned.
+	stopped          bool                 // whether the server has been stopped.
+	mt               naming.MountTable
+	publishOpt       veyron2.ServerPublishOpt // which endpoints to publish
+	servesMountTable bool
 }
 
 func InternalNewServer(streamMgr stream.Manager, mt naming.MountTable, opts ...ipc.ServerOpt) (ipc.Server, error) {
@@ -59,6 +58,8 @@
 			s.listenerOpts = append(s.listenerOpts, opt)
 		case veyron2.ServerPublishOpt:
 			s.publishOpt = opt
+		case veyron2.ServesMountTableOpt:
+			s.servesMountTable = bool(opt)
 		}
 	}
 	return s, nil
@@ -163,6 +164,11 @@
 	}
 	s.Unlock()
 	if len(publishEP) > 0 {
+		if !s.servesMountTable {
+			// Make sure that client MountTable code doesn't try and
+			// ResolveStep past this final address.
+			publishEP += "//"
+		}
 		s.publisher.AddServer(publishEP)
 	}
 	return ep, nil
@@ -370,10 +376,10 @@
 	fs.label = label
 	// TODO(ataly, ashankar): Populate the "discharges" field from the request object req.
 	if err != nil {
-		return nil, verror.Convert(err)
+		return nil, verror.Makef(verror.ErrorID(err), "%s: name: %q", err, req.Suffix)
 	}
 	if len(argptrs) != numArgs {
-		return nil, errWrongNumArgs
+		return nil, verror.BadProtocolf(fmt.Sprintf("ipc: wrong number of input arguments for method %q, name %q (called with %d args, expected %d)", req.Method, req.Suffix, numArgs, len(argptrs)))
 	}
 	for ix, argptr := range argptrs {
 		if err := fs.dec.Decode(argptr); err != nil {
@@ -420,7 +426,7 @@
 		}
 		// The dispatcher doesn't handle this suffix, try the next one.
 	}
-	return nil, nil, "", "", errNoDispatcher
+	return nil, nil, "", "", verror.NotFoundf(fmt.Sprintf("ipc: dispatcher not found for %q", name))
 }
 
 func (fs *flowServer) authorize(auth security.Authorizer) error {
@@ -467,7 +473,7 @@
 	return fs.dec.Decode(itemptr)
 }
 
-// Implementations of ipc.Context methods.
+// Implementations of ipc.ServerContext methods.
 
 func (fs *flowServer) Server() ipc.Server                            { return fs.server }
 func (fs *flowServer) Method() string                                { return fs.method }
diff --git a/runtimes/google/ipc/stream/doc.go b/runtimes/google/ipc/stream/doc.go
index b3401cb..0d6b8c0 100644
--- a/runtimes/google/ipc/stream/doc.go
+++ b/runtimes/google/ipc/stream/doc.go
@@ -8,7 +8,7 @@
 // Package contents and dependencies are as follows:
 //
 //      * manager provides a factory for veyron2/ipc/stream.Manager objects.
-//        It depends on the vif package.
+//        It depends on the vif and proxy packages.
 //      * vif implements a VIF type that wraps over a net.Conn
 //        and enables the creation of veyron2/ipc/stream.VC objects
 //        over the underlying network connection.
diff --git a/runtimes/google/ipc/stream/manager/listener.go b/runtimes/google/ipc/stream/manager/listener.go
index bd5f78c..33c81d7 100644
--- a/runtimes/google/ipc/stream/manager/listener.go
+++ b/runtimes/google/ipc/stream/manager/listener.go
@@ -8,6 +8,7 @@
 	"sync"
 	"time"
 
+	"veyron/runtimes/google/ipc/stream/proxy"
 	"veyron/runtimes/google/ipc/stream/vif"
 	"veyron/runtimes/google/lib/upcqueue"
 
@@ -15,6 +16,7 @@
 	"veyron2/naming"
 	"veyron2/verror"
 	"veyron2/vlog"
+	"veyron2/vom"
 )
 
 var errListenerIsClosed = errors.New("Listener has been Closed")
@@ -160,10 +162,9 @@
 	if err := vf.StartAccepting(ln.opts...); err != nil {
 		return nil, fmt.Errorf("already connected to proxy and accepting connections? VIF: %v, StartAccepting error: %v", vf, err)
 	}
-	// Proxy protocol:
-	// (1) Dial a VC to it (to include this processes' routing id in the proxy's routing table)
-	// (2) Open a Flow and wait for it to die (which should happen only when the proxy is down)
-	// For (1), need stream.VCOpt (identity etc.)
+	// Proxy protocol: See veyron/runtimes/google/ipc/stream/proxy/protocol.vdl
+	// Requires dialing a VC to the proxy, need to extract options (like the identity)
+	// from ln.opts to do so.
 	var dialOpts []stream.VCOpt
 	for _, opt := range ln.opts {
 		if dopt, ok := opt.(stream.VCOpt); ok {
@@ -183,6 +184,24 @@
 		vf.StopAccepting()
 		return nil, fmt.Errorf("unable to create liveness check flow to proxy: %v", err)
 	}
+	var request proxy.Request
+	var response proxy.Response
+	if err := vom.NewEncoder(flow).Encode(request); err != nil {
+		flow.Close()
+		vf.StopAccepting()
+		return nil, fmt.Errorf("failed to encode request to proxy: %v", err)
+	}
+	if err := vom.NewDecoder(flow).Decode(&response); err != nil {
+		flow.Close()
+		vf.StopAccepting()
+		return nil, fmt.Errorf("failed to decode response from proxy: %v", err)
+	}
+	if response.Error != nil {
+		flow.Close()
+		vf.StopAccepting()
+		return nil, fmt.Errorf("proxy error: %v", response.Error)
+	}
+
 	go func(vf *vif.VIF, flow stream.Flow) {
 		<-flow.Closed()
 		vf.StopAccepting()
diff --git a/runtimes/google/ipc/stream/proxy/http.go b/runtimes/google/ipc/stream/proxy/http.go
index cd5e33d..47f9fe2 100644
--- a/runtimes/google/ipc/stream/proxy/http.go
+++ b/runtimes/google/ipc/stream/proxy/http.go
@@ -17,18 +17,28 @@
 func (p *Proxy) ServeHTTP(w http.ResponseWriter, r *http.Request) {
 	w.Header().Set("Content-Type", "text/plain")
 	write := func(s string) { w.Write([]byte(s)) }
+	servers := p.servers.List()
 	p.mu.RLock()
 	defer p.mu.RUnlock()
-	write(fmt.Sprintf("Proxy with endpoint: %q and %d processes\n", p.Endpoint(), len(p.processes)))
+	write(fmt.Sprintf("Proxy with endpoint: %q. #Processes:%d #Servers:%d\n", p.Endpoint(), len(p.processes), len(servers)))
+	write("=========\n")
+	write("PROCESSES\n")
+	write("=========\n")
 	index := 1
-	for rid, process := range p.processes {
-		write(fmt.Sprintf("Process #%3d - RoutingID:%v [%v]", index, rid, process))
+	for process, _ := range p.processes {
+		write(fmt.Sprintf("(%d) - %v", index, process))
 		index++
 		process.mu.RLock()
-		write(fmt.Sprintf(" NextVCI:%d\n", process.nextVCI))
+		write(fmt.Sprintf(" NextVCI:%d #Severs:%d\n", process.nextVCI, len(process.servers)))
 		for vci, d := range process.routingTable {
 			write(fmt.Sprintf("    VCI %4d --> VCI %4d @ %s\n", vci, d.VCI, d.Process))
 		}
 		process.mu.RUnlock()
 	}
+	write("=======\n")
+	write("SERVERS\n")
+	write("=======\n")
+	for ix, is := range servers {
+		write(fmt.Sprintf("(%d) %v\n", ix+1, is))
+	}
 }
diff --git a/runtimes/google/ipc/stream/proxy/protocol.vdl b/runtimes/google/ipc/stream/proxy/protocol.vdl
new file mode 100644
index 0000000..48a73ab
--- /dev/null
+++ b/runtimes/google/ipc/stream/proxy/protocol.vdl
@@ -0,0 +1,26 @@
+package proxy
+
+// The proxy protocol is:
+// (1) Server establishes a VC to the proxy to register its routing id and authenticate.
+// (2) The server opens a flow and sends a "Request" message and waits for a "Response"
+//     message.
+// (3) This flow is then kept alive with no more data read/written.
+//     Closure of this flow indicates that proxying has (or should be) stopped.
+// (4) The proxy immediately closes any other flows on the VC.
+
+// Request is the message sent by a server to request that the proxy route
+// traffic intended for the server's RoutingID to the network connection
+// between the server and the proxy.
+type Request struct {
+  // TODO(ashankar): Things that will go in here include the mounttable and the name
+  // the server wants the proxy to use when mounting the server on the mounttable,
+  // possibly a blessing to give the proxy the credentials required to act as the
+  // server as far as the mounttable is concerned.
+}
+
+// Response is sent by the proxy to the server after processing Request.
+type Response struct {
+  // Error is a description of why the proxy refused to proxy the server.
+  // A nil error indicates that the proxy will route traffic to the server.
+  Error error
+}
\ No newline at end of file
diff --git a/runtimes/google/ipc/stream/proxy/protocol.vdl.go b/runtimes/google/ipc/stream/proxy/protocol.vdl.go
new file mode 100644
index 0000000..7bd2229
--- /dev/null
+++ b/runtimes/google/ipc/stream/proxy/protocol.vdl.go
@@ -0,0 +1,17 @@
+// This file was auto-generated by the veyron vdl tool.
+// Source: protocol.vdl
+
+package proxy
+
+// Request is the message sent by a server to request that the proxy route
+// traffic intended for the server's RoutingID to the network connection
+// between the server and the proxy.
+type Request struct {
+}
+
+// Response is sent by the proxy to the server after processing Request.
+type Response struct {
+	// Error is a description of why the proxy refused to proxy the server.
+	// A nil error indicates that the proxy will route traffic to the server.
+	Error error
+}
diff --git a/runtimes/google/ipc/stream/proxy/proxy.go b/runtimes/google/ipc/stream/proxy/proxy.go
index 67d16ee..e9ec40d 100644
--- a/runtimes/google/ipc/stream/proxy/proxy.go
+++ b/runtimes/google/ipc/stream/proxy/proxy.go
@@ -18,7 +18,9 @@
 	"veyron2"
 	"veyron2/naming"
 	"veyron2/security"
+	"veyron2/verror"
 	"veyron2/vlog"
+	"veyron2/vom"
 )
 
 var (
@@ -30,16 +32,16 @@
 // Proxy routes virtual circuit (VC) traffic between multiple underlying
 // network connections.
 type Proxy struct {
-	ln  net.Listener
-	rid naming.RoutingID
-	id  security.PrivateID
-
+	ln        net.Listener
+	rid       naming.RoutingID
+	id        security.PrivateID
 	mu        sync.RWMutex
-	processes map[naming.RoutingID]*process
+	servers   *servermap
+	processes map[*process]struct{}
 }
 
 // process encapsulates the physical network connection and the routing table
-// associated with a single peer process (identified by a naming.RoutingID).
+// associated with the process at the other end of the network connection.
 type process struct {
 	Conn  net.Conn
 	Queue *upcqueue.T
@@ -47,18 +49,86 @@
 	mu           sync.RWMutex
 	routingTable map[id.VC]*destination
 	nextVCI      id.VC
+	servers      map[id.VC]*vc.VC // servers wishing to be proxied create a VC that terminates at the proxy
 
-	// Some VCs terminate at the proxy process (for example, VCs initiated
-	// by servers wishing to be proxied).
-	proxyVCs map[id.VC]*vc.VC // VCs that terminate at this proxy
-	BQ       bqueue.T         // Flow control for messages sent on behalf of proxyVCs.
+	BQ bqueue.T // Flow control for messages sent on behalf of servers.
 }
 
+// destination is an entry in the routingtable of a process.
 type destination struct {
 	VCI     id.VC
 	Process *process
 }
 
+// server encapsulates information stored about a server exporting itself via the proxy.
+type server struct {
+	Process *process
+	VC      *vc.VC
+}
+
+func (s *server) RoutingID() naming.RoutingID { return s.VC.RemoteAddr().RoutingID() }
+func (s *server) Close(err error) {
+	if vc := s.Process.RemoveServerVC(s.VC.VCI()); vc != nil {
+		if err != nil {
+			vc.Close(err.Error())
+		} else {
+			vc.Close("server closed by proxy")
+		}
+	}
+	s.Process.SendCloseVC(s.VC.VCI(), err)
+}
+func (s *server) String() string {
+	return fmt.Sprintf("RoutingID %v on process %v (VCI:%v ID:%v)", s.RoutingID(), s.Process, s.VC.VCI(), s.VC.RemoteID())
+}
+
+// servermap is a concurrent-access safe map from the RoutingID of a server exporting itself
+// through the proxy to the underlying network connection that the server is found on.
+type servermap struct {
+	mu sync.Mutex
+	m  map[naming.RoutingID]*server
+}
+
+func (m *servermap) Add(server *server) error {
+	key := server.RoutingID()
+	m.mu.Lock()
+	defer m.mu.Unlock()
+	if m.m[key] != nil {
+		return fmt.Errorf("server with routing id %v is already being proxied", key)
+	}
+	m.m[key] = server
+	proxyLog().Infof("Started proxying server: %v", server)
+	return nil
+}
+
+func (m *servermap) Remove(server *server) {
+	key := server.RoutingID()
+	m.mu.Lock()
+	if m.m[key] != nil {
+		delete(m.m, key)
+		proxyLog().Infof("Stopped proxying server: %v", server)
+	}
+	m.mu.Unlock()
+}
+
+func (m *servermap) Process(rid naming.RoutingID) *process {
+	m.mu.Lock()
+	defer m.mu.Unlock()
+	if s := m.m[rid]; s != nil {
+		return s.Process
+	}
+	return nil
+}
+
+func (m *servermap) List() []string {
+	m.mu.Lock()
+	defer m.mu.Unlock()
+	ret := make([]string, 0, len(m.m))
+	for _, s := range m.m {
+		ret = append(ret, s.String())
+	}
+	return ret
+}
+
 // New creates a new Proxy that listens for network connections on the provided
 // (network, address) pair and routes VC traffic between accepted connections.
 func New(rid naming.RoutingID, identity security.PrivateID, network, address string) (*Proxy, error) {
@@ -70,7 +140,8 @@
 		ln:        ln,
 		rid:       rid,
 		id:        identity,
-		processes: make(map[naming.RoutingID]*process),
+		servers:   &servermap{m: make(map[naming.RoutingID]*server)},
+		processes: make(map[*process]struct{}),
 	}
 	go proxy.listenLoop()
 	return proxy, nil
@@ -88,13 +159,12 @@
 			Conn:         conn,
 			Queue:        upcqueue.New(),
 			routingTable: make(map[id.VC]*destination),
-			proxyVCs:     make(map[id.VC]*vc.VC),
+			servers:      make(map[id.VC]*vc.VC),
 			BQ:           drrqueue.New(vc.MaxPayloadSizeBytes),
 		}
 		go writeLoop(process)
+		go serverVCsLoop(process)
 		go p.readLoop(process)
-		go proxyVCLoop(process)
-		processLog().Infof("New network connection: %v", process)
 	}
 }
 
@@ -116,14 +186,14 @@
 	}
 }
 
-func proxyVCLoop(process *process) {
+func serverVCsLoop(process *process) {
 	for {
 		w, bufs, err := process.BQ.Get(nil)
 		if err != nil {
 			return
 		}
 		vci, fid := unpackIDs(w.ID())
-		if vc := process.ProxyVC(vci); vc != nil {
+		if vc := process.ServerVC(vci); vc != nil {
 			queueDataMessages(bufs, vc, fid, process.Queue)
 			if len(bufs) == 0 {
 				m := &message.Data{VCI: vci, Flow: fid}
@@ -161,9 +231,24 @@
 	}
 }
 
+func (p *Proxy) startProcess(process *process) {
+	p.mu.Lock()
+	p.processes[process] = struct{}{}
+	p.mu.Unlock()
+	processLog().Infof("Started process %v", process)
+}
+
+func (p *Proxy) stopProcess(process *process) {
+	process.Close()
+	p.mu.Lock()
+	delete(p.processes, process)
+	p.mu.Unlock()
+	processLog().Infof("Stopped process %v", process)
+}
+
 func (p *Proxy) readLoop(process *process) {
-	defer processLog().Infof("Exited readLoop for %v", process)
-	defer process.Close()
+	p.startProcess(process)
+	defer p.stopProcess(process)
 
 	reader := iobuf.NewReader(iobuf.NewPool(0), process.Conn)
 	defer reader.Close()
@@ -177,7 +262,7 @@
 		msgLog().Infof("Received msg: %T = %v", msg, msg)
 		switch m := msg.(type) {
 		case *message.Data:
-			if vc := process.ProxyVC(m.VCI); vc != nil {
+			if vc := process.ServerVC(m.VCI); vc != nil {
 				if err := vc.DispatchPayload(m.Flow, m.Payload); err != nil {
 					processLog().Infof("Ignoring data message %v from process %v: %v", m, process, err)
 				}
@@ -197,7 +282,7 @@
 			}
 			process.SendCloseVC(srcVCI, errNoRoutingTableEntry)
 		case *message.OpenFlow:
-			if vc := process.ProxyVC(m.VCI); vc != nil {
+			if vc := process.ServerVC(m.VCI); vc != nil {
 				if err := vc.AcceptFlow(m.Flow); err != nil {
 					processLog().Infof("OpenFlow %+v on process %v failed: %v", m, process, err)
 					cm := &message.Data{VCI: m.VCI, Flow: m.Flow}
@@ -218,7 +303,8 @@
 			}
 			process.SendCloseVC(srcVCI, errNoRoutingTableEntry)
 		case *message.CloseVC:
-			if process.RemoveProxyVC(m.VCI, m.Error) {
+			if vc := process.RemoveServerVC(m.VCI); vc != nil {
+				vc.Close(m.Error)
 				break
 			}
 			srcVCI := m.VCI
@@ -231,55 +317,42 @@
 		case *message.AddReceiveBuffers:
 			p.routeCounters(process, m.Counters)
 		case *message.OpenVC:
-			// Update processes map and routing tables if necessary.
-			srcrid := m.SrcEndpoint.RoutingID()
 			dstrid := m.DstEndpoint.RoutingID()
-			seenBefore, err := p.addProcess(srcrid, process)
-			if !seenBefore {
-				processLog().Infof("RoutingID %v associated with process %v", srcrid, process)
-				process.mu.Lock()
-				process.nextVCI = m.VCI + 1
-				process.mu.Unlock()
-				defer p.removeProcess(srcrid)
-			}
-			switch {
-			case err != nil:
-				process.SendCloseVC(m.VCI, err)
-			case naming.Compare(dstrid, p.rid) || naming.Compare(dstrid, naming.NullRoutingID):
-				if !process.AddProxyVC(m, p.id) {
-					process.SendCloseVC(m.VCI, errDuplicateOpenVC)
-				}
+			if naming.Compare(dstrid, p.rid) || naming.Compare(dstrid, naming.NullRoutingID) {
+				// VC that terminates at the proxy.
+				// See protocol.vdl for details on the protocol between the server and the proxy.
+				vc := process.NewServerVC(m)
+				// route counters after creating the VC so counters to vc are not lost.
 				p.routeCounters(process, m.Counters)
-			default:
-				// Find the process corresponding to dstrid
-				p.mu.RLock()
-				dstProcess := p.processes[dstrid]
-				p.mu.RUnlock()
-				if dstProcess == nil {
-					process.SendCloseVC(m.VCI, fmt.Errorf("routing id %v is not connected to the proxy", dstrid))
-					break
+				if vc != nil {
+					server := &server{Process: process, VC: vc}
+					go p.runServer(server, vc.HandshakeAcceptedVC(veyron2.LocalID(p.id)))
 				}
-				// Update the routing tables
-				srcVCI := m.VCI
-				dstVCI := dstProcess.AllocVCI()
-				startRoutingVC(srcVCI, dstVCI, process, dstProcess)
-				// Forward the OpenVC message.
-				// Typically, an OpenVC message is accompanied with Counters for
-				// the new VC. Keep that in the forwarded message and route the
-				// remaining counters separately.
-				counters := m.Counters
-
-				m.Counters = message.NewCounters()
-				for cid, bytes := range counters {
-					if cid.VCI() == m.VCI {
-						m.Counters.Add(dstVCI, cid.Flow(), bytes)
-						delete(counters, cid)
-					}
-				}
-				m.VCI = dstVCI
-				dstProcess.Queue.Put(m)
-				p.routeCounters(process, counters)
+				break
 			}
+			dstprocess := p.servers.Process(dstrid)
+			if dstprocess == nil {
+				process.SendCloseVC(m.VCI, fmt.Errorf("no server with routing id %v is being proxied", dstrid))
+				p.routeCounters(process, m.Counters)
+				break
+			}
+			srcVCI := m.VCI
+			dstVCI := dstprocess.AllocVCI()
+			startRoutingVC(srcVCI, dstVCI, process, dstprocess)
+			// Forward the OpenVC message.
+			// Typically, an OpenVC message is accompanied with Counters for the new VC.
+			// Keep that in the forwarded message and route the remaining counters separately.
+			counters := m.Counters
+			m.Counters = message.NewCounters()
+			for cid, bytes := range counters {
+				if cid.VCI() == srcVCI {
+					m.Counters.Add(dstVCI, cid.Flow(), bytes)
+					delete(counters, cid)
+				}
+			}
+			m.VCI = dstVCI
+			dstprocess.Queue.Put(m)
+			p.routeCounters(process, counters)
 		default:
 			processLog().Infof("Closing %v because of unrecognized message %T", process, m)
 			return
@@ -287,42 +360,58 @@
 	}
 }
 
-func (p *Proxy) addProcess(rid naming.RoutingID, process *process) (bool, error) {
-	p.mu.Lock()
-	defer p.mu.Unlock()
-	switch p.processes[rid] {
-	case nil:
-		// First time this rid was seen.
-		p.processes[rid] = process
-		return false, nil
-	case process:
-		// Same (rid, process) pair as before. Nothing to do.
-		return true, nil
-	default:
-		// Conflicting (rid, process) pairs.
-		// TODO(ashankar): This means that the first process to
-		// advertise a particular srcrid gets into the routing
-		// table. What's our security strategy vis-a-vis faking
-		// routing ids?
-		return true, fmt.Errorf("routing id %v is registered by another process at the proxy", rid)
+func (p *Proxy) runServer(server *server, c <-chan vc.HandshakeResult) {
+	hr := <-c
+	if hr.Error != nil {
+		server.Close(hr.Error)
+		return
 	}
-}
+	// See comments in protocol.vdl for the protocol between servers and the proxy.
+	conn, err := hr.Listener.Accept()
+	if err != nil {
+		server.Close(errors.New("failed to accept health check flow"))
+		return
+	}
+	defer server.Process.RemoveServerVC(server.VC.VCI())
+	defer server.VC.Close("stopped proxying server")
+	server.Process.InitVCI(server.VC.VCI())
 
-func (p *Proxy) removeProcess(rid naming.RoutingID) {
-	p.mu.Lock()
-	delete(p.processes, rid)
-	p.mu.Unlock()
-	processLog().Infof("Removed routing for %v", rid)
+	var request Request
+	var response Response
+	if err := vom.NewDecoder(conn).Decode(&request); err != nil {
+		response.Error = verror.BadProtocolf("proxy: unable to read Request: %v", err)
+	} else if err := p.servers.Add(server); err != nil {
+		response.Error = verror.Convert(err)
+	} else {
+		defer p.servers.Remove(server)
+	}
+	if err := vom.NewEncoder(conn).Encode(response); err != nil {
+		proxyLog().Infof("Failed to encode response %#v for server %v", response, server)
+		server.Close(err)
+		return
+	}
+	// Reject all other flows
+	go func() {
+		for {
+			flow, err := hr.Listener.Accept()
+			if err != nil {
+				return
+			}
+			flow.Close()
+		}
+	}()
+	// Wait for this flow to be closed.
+	<-conn.Closed()
 }
 
 func (p *Proxy) routeCounters(process *process, counters message.Counters) {
 	// Since each VC can be routed to a different process, split up the
 	// Counters into one message per VC.
 	// Ideally, would split into one message per process (rather than per
-	// VC). This optimization is left an as excercise to the interested.
+	// flow). This optimization is left an as excercise to the interested.
 	for cid, bytes := range counters {
 		srcVCI := cid.VCI()
-		if vc := process.proxyVCs[srcVCI]; vc != nil {
+		if vc := process.servers[srcVCI]; vc != nil {
 			vc.ReleaseCounters(cid.Flow(), bytes)
 			continue
 		}
@@ -354,7 +443,7 @@
 	p.ln.Close()
 	p.mu.Lock()
 	defer p.mu.Unlock()
-	for _, process := range p.processes {
+	for process, _ := range p.processes {
 		process.Close()
 	}
 }
@@ -376,6 +465,14 @@
 	p.mu.Unlock()
 }
 
+func (p *process) InitVCI(vci id.VC) {
+	p.mu.Lock()
+	if p.nextVCI <= vci {
+		p.nextVCI = vci + 1
+	}
+	p.mu.Unlock()
+}
+
 func (p *process) AllocVCI() id.VC {
 	p.mu.Lock()
 	ret := p.nextVCI
@@ -402,6 +499,9 @@
 	p.mu.Lock()
 	rt := p.routingTable
 	p.routingTable = nil
+	for _, vc := range p.servers {
+		vc.Close("net.Conn is closing")
+	}
 	p.mu.Unlock()
 
 	for _, d := range rt {
@@ -412,18 +512,18 @@
 	p.Conn.Close()
 }
 
-func (p *process) ProxyVC(vci id.VC) *vc.VC {
+func (p *process) ServerVC(vci id.VC) *vc.VC {
 	p.mu.Lock()
 	defer p.mu.Unlock()
-	return p.proxyVCs[vci]
+	return p.servers[vci]
 }
 
-func (p *process) AddProxyVC(m *message.OpenVC, id security.PrivateID) bool {
+func (p *process) NewServerVC(m *message.OpenVC) *vc.VC {
 	p.mu.Lock()
 	defer p.mu.Unlock()
-	if vc := p.proxyVCs[m.VCI]; vc != nil {
+	if vc := p.servers[m.VCI]; vc != nil {
 		vc.Close("duplicate OpenVC request")
-		return false
+		return nil
 	}
 	vc := vc.InternalNew(vc.Params{
 		VCI:          m.VCI,
@@ -433,55 +533,20 @@
 		ReserveBytes: message.HeaderSizeBytes,
 		Helper:       p,
 	})
-	p.proxyVCs[m.VCI] = vc
-	proxyLog().Infof("Opening VC %v from process %v", vc, p)
-	go p.handleProxyVC(vc, vc.HandshakeAcceptedVC(veyron2.LocalID(id)))
-	return true
+	p.servers[m.VCI] = vc
+	proxyLog().Infof("Registered VC %v from server on process %v", vc, p)
+	return vc
 }
 
-func (p *process) handleProxyVC(vc *vc.VC, c <-chan vc.HandshakeResult) {
-	hr := <-c
-	if hr.Error != nil {
-		p.RemoveProxyVC(vc.VCI(), fmt.Sprintf("handshake failed: %v", hr.Error))
-		p.SendCloseVC(vc.VCI(), hr.Error)
-		return
-	}
-	// The proxy protocol is:
-	// (1) Server establishes a VC to the proxy to setup routing table and
-	// authenticate.
-	// (2) The server opens a flow and waits for it to be closed.  No data
-	// is every read/written on the flow, the flow closure is an indication
-	// of the connection to the proxy dying.
-	//
-	// The proxy expects this "health" flow to be the first one and rejects
-	// any other flows on the VC.
-	//
-	// TODO(ashankar): Document this "protocol" once it is stable.
-	_, err := hr.Listener.Accept()
-	if err != nil {
-		vc.Close("failed to accept health check flow")
-		return
-	}
-	// Reject all other flows
-	for {
-		flow, err := hr.Listener.Accept()
-		if err != nil {
-			return
-		}
-		flow.Close()
-	}
-}
-
-func (p *process) RemoveProxyVC(vci id.VC, reason string) bool {
+func (p *process) RemoveServerVC(vci id.VC) *vc.VC {
 	p.mu.Lock()
 	defer p.mu.Unlock()
-	if vc := p.proxyVCs[vci]; vc != nil {
-		proxyLog().Infof("Closing VC %v from process %v", vc, p)
-		vc.Close(reason)
-		delete(p.proxyVCs, vci)
-		return true
+	if vc := p.servers[vci]; vc != nil {
+		delete(p.servers, vci)
+		proxyLog().Infof("Unregistered server VC %v from process %v", vc, p)
+		return vc
 	}
-	return false
+	return nil
 }
 
 // Make process implement vc.Helper
diff --git a/runtimes/google/ipc/stream/proxy/proxy_test.go b/runtimes/google/ipc/stream/proxy/proxy_test.go
index d86676c..dacf405 100644
--- a/runtimes/google/ipc/stream/proxy/proxy_test.go
+++ b/runtimes/google/ipc/stream/proxy/proxy_test.go
@@ -40,7 +40,7 @@
 	}
 	defer ln1.Close()
 
-	// Create the stream.Manager for a second server1.
+	// Create the stream.Manager for a second server.
 	server2 := manager.InternalNew(naming.FixedRoutingID(0x2222222222222222))
 	defer server2.Shutdown()
 	// Setup a stream.Listener that will accept VCs and Flows routed
@@ -104,7 +104,7 @@
 	defer ln1.Close()
 
 	ln2, ep2, err := server2.Listen(proxy.Endpoint().Network(), proxy.Endpoint().String())
-	if pattern := "routing id 00000000000000005555555555555555 is registered by another process at the proxy"; err == nil || !strings.Contains(err.Error(), pattern) {
+	if pattern := "routing id 00000000000000005555555555555555 is already being proxied"; err == nil || !strings.Contains(err.Error(), pattern) {
 		t.Errorf("Got (%v, %v, %v) want error \"...%v\" (ep1:%v)", ln2, ep2, err, pattern, ep1)
 	}
 }
diff --git a/runtimes/google/ipc/stream/vc/vc.go b/runtimes/google/ipc/stream/vc/vc.go
index 19f1ddb..f41ce67 100644
--- a/runtimes/google/ipc/stream/vc/vc.go
+++ b/runtimes/google/ipc/stream/vc/vc.go
@@ -291,7 +291,7 @@
 // Close closes the VC and all flows on it, allowing any pending writes in the
 // flow to drain.
 func (vc *VC) Close(reason string) error {
-	vlog.VI(1).Infof("Closing VCI %d. Reason:%q", vc.vci, reason)
+	vlog.VI(1).Infof("Closing VC %v. Reason:%q", vc, reason)
 	vc.mu.Lock()
 	flows := vc.flowMap
 	vc.flowMap = nil
@@ -304,7 +304,7 @@
 
 	vc.sharedCounters.Close()
 	for fid, flow := range flows {
-		vlog.VI(2).Infof("Closing flow %d on VC %d as VC is being closed(%q)", fid, vc.vci, reason)
+		vlog.VI(2).Infof("Closing flow %d on VC %v as VC is being closed(%q)", fid, vc, reason)
 		flow.Close()
 	}
 	return nil
diff --git a/runtimes/google/lib/gateway/client_linux.go b/runtimes/google/lib/gateway/client_linux.go
index 38ac3a0..026d172 100644
--- a/runtimes/google/lib/gateway/client_linux.go
+++ b/runtimes/google/lib/gateway/client_linux.go
@@ -9,6 +9,7 @@
 	"time"
 
 	"veyron/runtimes/google/lib/unit"
+	"veyron2/rt"
 	"veyron2/services/proximity"
 	"veyron2/vlog"
 
@@ -87,7 +88,7 @@
 		case <-t:
 		}
 
-		nearby, err := c.proximity.NearbyDevices()
+		nearby, err := c.proximity.NearbyDevices(rt.R().TODOContext())
 		if err != nil {
 			vlog.Errorf("error getting nearby devices list: %v", err)
 			continue
diff --git a/runtimes/google/lib/gateway/server_linux.go b/runtimes/google/lib/gateway/server_linux.go
index 7e01b24..a295647 100644
--- a/runtimes/google/lib/gateway/server_linux.go
+++ b/runtimes/google/lib/gateway/server_linux.go
@@ -10,6 +10,7 @@
 	"text/template"
 	"time"
 
+	"veyron2/rt"
 	"veyron2/services/proximity"
 	"veyron2/vlog"
 
@@ -269,13 +270,13 @@
 
 func (s *server) advertiseName(name string) {
 	if s.advertisedName != "" {
-		if err := s.proximity.UnregisterName(s.advertisedName); err != nil {
+		if err := s.proximity.UnregisterName(rt.R().TODOContext(), s.advertisedName); err != nil {
 			vlog.Errorf("error unregistering name %q with proximity service: %v", s.advertisedName, err)
 		}
 	}
 	s.advertisedName = ""
 	if name != "" {
-		if err := s.proximity.RegisterName(name); err == nil {
+		if err := s.proximity.RegisterName(rt.R().TODOContext(), name); err == nil {
 			s.advertisedName = name
 		} else {
 			vlog.Errorf("error registering name %q with proximity service: %v", name, err)
diff --git a/runtimes/google/lib/proximity/service.go b/runtimes/google/lib/proximity/service.go
index 6647fb0..fcba302 100644
--- a/runtimes/google/lib/proximity/service.go
+++ b/runtimes/google/lib/proximity/service.go
@@ -110,7 +110,7 @@
 	advDoneChan      chan bool
 }
 
-func (s *service) RegisterName(_ ipc.Context, name string) error {
+func (s *service) RegisterName(_ ipc.ServerContext, name string) error {
 	s.nameLock.Lock()
 	defer s.nameLock.Unlock()
 	if v, ok := s.names[name]; ok {
@@ -124,7 +124,7 @@
 	return nil
 }
 
-func (s *service) UnregisterName(_ ipc.Context, name string) error {
+func (s *service) UnregisterName(_ ipc.ServerContext, name string) error {
 	s.nameLock.Lock()
 	defer s.nameLock.Unlock()
 	v, ok := s.names[name]
@@ -141,7 +141,7 @@
 
 // NearbyDevices returns the list of nearby devices, sorted in increasing
 // distance order.
-func (s *service) NearbyDevices(_ ipc.Context) ([]prox.Device, error) {
+func (s *service) NearbyDevices(_ ipc.ServerContext) ([]prox.Device, error) {
 	s.deviceLock.RLock()
 	defer s.deviceLock.RUnlock()
 	return s.nearby, nil
diff --git a/runtimes/google/naming/mounttable/all_test.go b/runtimes/google/naming/mounttable/all_test.go
index 0ba9f41..a3d67b8 100644
--- a/runtimes/google/naming/mounttable/all_test.go
+++ b/runtimes/google/naming/mounttable/all_test.go
@@ -61,8 +61,10 @@
 	return "Who's there?"
 }
 
-func knockKnock(t *testing.T, client ipc.Client, name string) {
-	call, err := client.StartCall(name, "KnockKnock", nil)
+func knockKnock(t *testing.T, runtime veyron2.Runtime, name string) {
+	client := runtime.Client()
+	ctx := runtime.NewContext()
+	call, err := client.StartCall(ctx, name, "KnockKnock", nil)
 	if err != nil {
 		boom(t, "StartCall failed: %s", err)
 	}
@@ -254,15 +256,15 @@
 	}
 
 	// This mounts the service OA (ep/joke1) as joke1.
-	if err := mt.Mount("joke1", naming.JoinAddressName(estr, "joke1"), ttl); err != nil {
+	if err := mt.Mount("joke1", naming.JoinAddressName(estr, "//joke1"), ttl); err != nil {
 		boom(t, "Failed to Mount joke1: %s", err)
 	}
 	// This mounts the raw server endpoint as joke2 -- like Publish would.
-	if err := mt.Mount("joke2", naming.JoinAddressName(estr, ""), ttl); err != nil {
+	if err := mt.Mount("joke2", naming.JoinAddressName(estr, "")+"//", ttl); err != nil {
 		boom(t, "Failed to Mount joke2: %s", err)
 	}
 	// This mounts the raw server endpoint as joke3 in mt3 -- like Publish would.
-	if err := mt.Mount("mt3/joke3", naming.JoinAddressName(estr, ""), ttl); err != nil {
+	if err := mt.Mount("mt3/joke3", naming.JoinAddressName(estr, "")+"//", ttl); err != nil {
 		boom(t, "Failed to Mount joke3: %s", err)
 	}
 
@@ -293,14 +295,16 @@
 	// And the MountTable that serves //mt4/mt5 is /<epstr>//mt1/mt4/mt5
 	testResolveToMountTable(t, mt, "//mt4/mt5", naming.JoinAddressName(estr, "//mt1//mt4/mt5"))
 
+	vlog.Infof("\n-------------------------------------------------")
 	jokeTests := []struct {
 		name, resolved, resolvedToMT string
 	}{
 		{"joke1", naming.JoinAddressName(estr, "//joke1"), naming.JoinAddressName(estr, "//mt1/joke1")},
-		{"joke2", naming.JoinAddressName(estr, ""), naming.JoinAddressName(estr, "//mt1/joke2")},
-		{"mt3/joke3", naming.JoinAddressName(estr, ""), naming.JoinAddressName(estr, "//mt3/joke3")},
+		{"joke2", naming.JoinAddressName(estr, "") + "//", naming.JoinAddressName(estr, "//mt1/joke2")},
+		{"mt3/joke3", naming.JoinAddressName(estr, "") + "//", naming.JoinAddressName(estr, "//mt3/joke3")},
 	}
 	for _, test := range jokeTests {
+
 		servers, err := mt.Resolve(test.name)
 		if err != nil {
 			boom(t, "Failed to Resolve %s: %s", test.name, err)
@@ -308,6 +312,7 @@
 		if len(servers) != 1 || servers[0] != test.resolved {
 			boom(t, "Resolve %s returned wrong servers: %v, expected: %s", test.name, servers, test.resolved)
 		}
+
 		servers, err = mt.ResolveToMountTable(test.name)
 		if err != nil {
 			boom(t, "Failed to ResolveToMountTable %s: %s", test.name, err)
@@ -317,9 +322,9 @@
 		}
 	}
 
-	knockKnock(t, r.Client(), "joke1")
-	knockKnock(t, r.Client(), "joke2/joke2")
-	knockKnock(t, r.Client(), "mt3/joke3/joke3")
+	knockKnock(t, r, "joke1")
+	knockKnock(t, r, "joke2/joke2")
+	knockKnock(t, r, "mt3/joke3/joke3")
 
 	// Try various globs.
 	globTests := []struct {
@@ -327,6 +332,7 @@
 		expected []string
 	}{
 		{"*", []string{"mt2", "mt3", "joke1", "joke2"}},
+
 		{"*/...", []string{"mt2", "mt3", "mt2/mt4", "mt3/mt4", "mt2/mt4/mt5", "mt3/mt4/mt5", "joke1", "joke2", "mt3/joke3"}},
 		{"*/m?4/*5", []string{"mt2/mt4/mt5", "mt3/mt4/mt5"}},
 		{"*2*/*/*5", []string{"mt2/mt4/mt5"}},
@@ -337,4 +343,5 @@
 		out := doGlob(t, mt, test.pattern)
 		checkMatch(t, test.pattern, test.expected, out)
 	}
+
 }
diff --git a/runtimes/google/naming/mounttable/glob.go b/runtimes/google/naming/mounttable/glob.go
index 8abadce..ddc5ae6 100644
--- a/runtimes/google/naming/mounttable/glob.go
+++ b/runtimes/google/naming/mounttable/glob.go
@@ -36,7 +36,8 @@
 		}
 
 		for _, s := range mtServers {
-			call, err := ns.rt.Client().StartCall(s, "Glob", []interface{}{pstr}, callTimeout)
+			client := ns.rt.Client()
+			call, err := client.StartCall(ns.rt.TODOContext(), s, "Glob", []interface{}{pstr}, callTimeout)
 			if err != nil {
 				lastErr = err
 				continue // try another instance
diff --git a/runtimes/google/naming/mounttable/mount.go b/runtimes/google/naming/mounttable/mount.go
index 7d83f01..c781f3d 100644
--- a/runtimes/google/naming/mounttable/mount.go
+++ b/runtimes/google/naming/mounttable/mount.go
@@ -3,12 +3,13 @@
 import (
 	"time"
 
-	"veyron2/ipc"
+	"veyron2"
 )
 
 // mountIntoMountTable mounts a single server into a single mount table.
-func mountIntoMountTable(client ipc.Client, name, server string, ttl time.Duration) error {
-	call, err := client.StartCall(name, "Mount", []interface{}{server, uint32(ttl.Seconds())}, callTimeout)
+func mountIntoMountTable(runtime veyron2.Runtime, name, server string, ttl time.Duration) error {
+	client := runtime.Client()
+	call, err := client.StartCall(runtime.TODOContext(), name, "Mount", []interface{}{server, uint32(ttl.Seconds())}, callTimeout)
 	if err != nil {
 		return err
 	}
@@ -19,8 +20,9 @@
 }
 
 // unmountFromMountTable removes a single mounted server from a single mount table.
-func unmountFromMountTable(client ipc.Client, name, server string) error {
-	call, err := client.StartCall(name, "Unmount", []interface{}{server}, callTimeout)
+func unmountFromMountTable(runtime veyron2.Runtime, name, server string) error {
+	client := runtime.Client()
+	call, err := client.StartCall(runtime.TODOContext(), name, "Unmount", []interface{}{server}, callTimeout)
 	if err != nil {
 		return err
 	}
@@ -40,7 +42,7 @@
 	c := make(chan error, len(mtServers))
 	for _, mt := range mtServers {
 		go func() {
-			c <- mountIntoMountTable(ns.rt.Client(), mt, server, ttl)
+			c <- mountIntoMountTable(ns.rt, mt, server, ttl)
 		}()
 	}
 	// Return error if any mounts failed, since otherwise we'll get
@@ -64,7 +66,7 @@
 	c := make(chan error, len(mts))
 	for _, mt := range mts {
 		go func() {
-			c <- unmountFromMountTable(ns.rt.Client(), mt, server)
+			c <- unmountFromMountTable(ns.rt, mt, server)
 		}()
 	}
 	// Return error if any mounts failed, since otherwise we'll get
diff --git a/runtimes/google/naming/mounttable/namespace.go b/runtimes/google/naming/mounttable/namespace.go
index 7a8bb00..6de47ad 100644
--- a/runtimes/google/naming/mounttable/namespace.go
+++ b/runtimes/google/naming/mounttable/namespace.go
@@ -40,9 +40,8 @@
 	return &namespace{rt: rt, roots: roots}, nil
 }
 
-// TODO(cnicolaou,caprita): make this a public interface.
-// SetLocalRoots points the local roots at a set of mount table servers.
-func (ns *namespace) SetLocalRoots(roots ...string) error {
+// SetRoots implements naming.MountTable.SetRoots
+func (ns *namespace) SetRoots(roots []string) error {
 	if !rooted(roots) {
 		return badRoots(roots)
 	}
diff --git a/runtimes/google/naming/mounttable/resolve.go b/runtimes/google/naming/mounttable/resolve.go
index 3efe3c7..43d9b59 100644
--- a/runtimes/google/naming/mounttable/resolve.go
+++ b/runtimes/google/naming/mounttable/resolve.go
@@ -3,6 +3,7 @@
 import (
 	"errors"
 
+	"veyron2"
 	"veyron2/ipc"
 	"veyron2/naming"
 	"veyron2/verror"
@@ -18,7 +19,8 @@
 	return
 }
 
-func resolveAgainstMountTable(client ipc.Client, names []string) ([]string, error) {
+func resolveAgainstMountTable(runtime veyron2.Runtime, names []string) ([]string, error) {
+	client := runtime.Client()
 	// Try each server till one answers.
 	finalErr := errors.New("no servers to resolve query")
 	for _, name := range names {
@@ -26,7 +28,7 @@
 		// address, without recursing through ourselves. To this we force
 		// the entire name component to be terminal.
 		name = naming.MakeTerminal(name)
-		call, err := client.StartCall(name, "ResolveStep", nil, callTimeout)
+		call, err := client.StartCall(runtime.TODOContext(), name, "ResolveStep", nil, callTimeout)
 		if err != nil {
 			finalErr = err
 			vlog.VI(2).Infof("ResolveStep.StartCall %s failed: %s", name, err)
@@ -86,7 +88,7 @@
 		}
 		var err error
 		curr := names
-		if names, err = resolveAgainstMountTable(ns.rt.Client(), names); err != nil {
+		if names, err = resolveAgainstMountTable(ns.rt, names); err != nil {
 
 			// If the name could not be found in the mount table, return an error.
 			if verror.Equal(naming.ErrNoSuchNameRoot, err) {
@@ -116,7 +118,10 @@
 		vlog.VI(2).Infof("ResolveToMountTable loop %s", names)
 		var err error
 		curr := names
-		if names, err = resolveAgainstMountTable(ns.rt.Client(), names); err != nil {
+		if terminal(curr) {
+			return makeTerminal(last), nil
+		}
+		if names, err = resolveAgainstMountTable(ns.rt, names); err != nil {
 			if verror.Equal(naming.ErrNoSuchNameRoot, err) {
 				return makeTerminal(last), nil
 			}
@@ -136,15 +141,13 @@
 			// mounttable rather than an error.
 			return nil, err
 		}
-		if terminal(curr) {
-			return curr, nil
-		}
+
 		last = curr
 	}
 	return nil, naming.ErrResolutionDepthExceeded
 }
 
-func finishUnresolve(call ipc.ClientCall) ([]string, error) {
+func finishUnresolve(call ipc.Call) ([]string, error) {
 	var newNames []string
 	var unresolveErr error
 	if err := call.Finish(&newNames, &unresolveErr); err != nil {
@@ -153,11 +156,12 @@
 	return newNames, unresolveErr
 }
 
-func unresolveAgainstServer(client ipc.Client, names []string) ([]string, error) {
+func unresolveAgainstServer(runtime veyron2.Runtime, names []string) ([]string, error) {
+	client := runtime.Client()
 	finalErr := errors.New("no servers to unresolve")
 	for _, name := range names {
 		name = naming.MakeTerminal(name)
-		call, err := client.StartCall(name, "UnresolveStep", nil, callTimeout)
+		call, err := client.StartCall(runtime.TODOContext(), name, "UnresolveStep", nil, callTimeout)
 		if err != nil {
 			finalErr = err
 			vlog.VI(2).Infof("StartCall %q.UnresolveStep() failed: %s", name, err)
@@ -192,7 +196,7 @@
 	for remaining := maxDepth; remaining > 0; remaining-- {
 		vlog.VI(2).Infof("Unresolve loop %s", names)
 		curr := names
-		if names, err = unresolveAgainstServer(ns.rt.Client(), names); err != nil {
+		if names, err = unresolveAgainstServer(ns.rt, names); err != nil {
 			return nil, err
 		}
 		if len(names) == 0 {
diff --git a/runtimes/google/rt/ipc.go b/runtimes/google/rt/ipc.go
index 7f1c3ec..2c16c3d 100644
--- a/runtimes/google/rt/ipc.go
+++ b/runtimes/google/rt/ipc.go
@@ -37,6 +37,14 @@
 	return rt.client
 }
 
+func (rt *vrt) NewContext() ipc.Context {
+	return iipc.InternalNewContext()
+}
+
+func (rt *vrt) TODOContext() ipc.Context {
+	return iipc.InternalNewContext()
+}
+
 func (rt *vrt) NewServer(opts ...ipc.ServerOpt) (ipc.Server, error) {
 	// Start the http debug server exactly once for this process
 	rt.startHTTPDebugServerOnce()
diff --git a/runtimes/google/rt/rt.go b/runtimes/google/rt/rt.go
index 6122930..19d4871 100644
--- a/runtimes/google/rt/rt.go
+++ b/runtimes/google/rt/rt.go
@@ -6,14 +6,15 @@
 	"os"
 	"sync"
 
+	"veyron/lib/exec"
+	imounttable "veyron/runtimes/google/naming/mounttable"
+
 	"veyron2"
 	"veyron2/ipc"
 	"veyron2/ipc/stream"
 	"veyron2/naming"
 	"veyron2/product"
 	"veyron2/vlog"
-
-	imounttable "veyron/runtimes/google/naming/mounttable"
 )
 
 type vrt struct {
@@ -117,6 +118,19 @@
 		return err
 	}
 
+	handle, err := exec.GetChildHandle()
+	switch err {
+	case exec.ErrNoVersion:
+		// The process has not been started through the veyron exec
+		// library. No further action is needed.
+	case nil:
+		// The process has been started through the veyron exec
+		// library. Signal the parent the the child is ready.
+		handle.SetReady()
+	default:
+		return err
+	}
+
 	vlog.VI(2).Infof("rt.Init done")
 	return nil
 }
diff --git a/runtimes/google/testing/mocks/ipc/simple_client.go b/runtimes/google/testing/mocks/ipc/simple_client.go
index 201e96c..907ecf8 100644
--- a/runtimes/google/testing/mocks/ipc/simple_client.go
+++ b/runtimes/google/testing/mocks/ipc/simple_client.go
@@ -39,7 +39,7 @@
 func (c *SimpleMockClient) IPCBindOpt() {}
 
 // StartCall Implements ipc.Client
-func (c *SimpleMockClient) StartCall(name, method string, args []interface{}, opts ...ipc.ClientCallOpt) (ipc.ClientCall, error) {
+func (c *SimpleMockClient) StartCall(ctx ipc.Context, name, method string, args []interface{}, opts ...ipc.CallOpt) (ipc.Call, error) {
 	results, ok := c.results[method]
 	if !ok {
 		return nil, errors.New(fmt.Sprintf("method %s not found", method))
@@ -60,22 +60,22 @@
 func (*SimpleMockClient) Close() {
 }
 
-// mockCall implements ipc.ClientCall
+// mockCall implements ipc.Call
 type mockCall struct {
 	mockStream
 	results []interface{}
 }
 
-// Cancel implements ipc.ClientCall
+// Cancel implements ipc.Call
 func (*mockCall) Cancel() {
 }
 
-// CloseSend implements ipc.ClientCall
+// CloseSend implements ipc.Call
 func (*mockCall) CloseSend() error {
 	return nil
 }
 
-// Finish implements ipc.ClientCall
+// Finish implements ipc.Call
 func (mc *mockCall) Finish(resultptrs ...interface{}) error {
 	if got, want := len(resultptrs), len(mc.results); got != want {
 		return errors.New(fmt.Sprintf("wrong number of output results; expected resultptrs of size %d but got %d", want, got))
diff --git a/runtimes/google/testing/mocks/ipc/simple_client_test.go b/runtimes/google/testing/mocks/ipc/simple_client_test.go
index cfb8426..8adecd1 100644
--- a/runtimes/google/testing/mocks/ipc/simple_client_test.go
+++ b/runtimes/google/testing/mocks/ipc/simple_client_test.go
@@ -4,6 +4,8 @@
 	"testing"
 )
 
+type fakeContext struct{}
+
 func TestSuccessfulCalls(t *testing.T) {
 
 	method1ExpectedResult := []interface{}{"one", 2}
@@ -16,8 +18,10 @@
 		"method3": method3ExpectedResult,
 	})
 
+	ctx := &fakeContext{}
+
 	// method1
-	method1Call, err := client.StartCall("name/obj", "method1", []interface{}{})
+	method1Call, err := client.StartCall(ctx, "name/obj", "method1", []interface{}{})
 	if err != nil {
 		t.Errorf("StartCall: did not expect an error return")
 		return
@@ -35,7 +39,7 @@
 	}
 
 	// method2
-	method2Call, err := client.StartCall("name/obj", "method2", []interface{}{})
+	method2Call, err := client.StartCall(ctx, "name/obj", "method2", []interface{}{})
 	if err != nil {
 		t.Errorf(`StartCall: did not expect an error return`)
 		return
@@ -48,7 +52,7 @@
 
 	// method3
 	var result interface{}
-	method3Call, err := client.StartCall("name/obj", "method3", []interface{}{})
+	method3Call, err := client.StartCall(ctx, "name/obj", "method3", []interface{}{})
 	if err != nil {
 		t.Errorf(`StartCall: did not expect an error return`)
 		return
@@ -70,7 +74,7 @@
 			sampleStruct{name: "bar"},
 		},
 	})
-	call, _ := client.StartCall("name/obj", "foo", []interface{}{})
+	call, _ := client.StartCall(&fakeContext{}, "name/obj", "foo", []interface{}{})
 	var result sampleStruct
 	call.Finish(&result)
 	if result.name != "bar" {
@@ -83,7 +87,7 @@
 	client := NewSimpleClient(map[string][]interface{}{
 		"bar": []interface{}{},
 	})
-	_, err := client.StartCall("name/obj", "wrongMethodName", []interface{}{})
+	_, err := client.StartCall(&fakeContext{}, "name/obj", "wrongMethodName", []interface{}{})
 	if err == nil {
 		t.Errorf(`StartCall: should have returned an error on invalid method name`)
 		return
@@ -97,18 +101,19 @@
 	})
 
 	errMsg := "Expected method to be called %d times but it was called %d"
+	ctx := &fakeContext{}
 
 	// method 1
 	if n := client.TimesCalled("method1"); n != 0 {
 		t.Errorf(errMsg, 0, n)
 		return
 	}
-	client.StartCall("name/of/object", "method1", []interface{}{})
+	client.StartCall(ctx, "name/of/object", "method1", []interface{}{})
 	if n := client.TimesCalled("method1"); n != 1 {
 		t.Errorf(errMsg, 1, n)
 		return
 	}
-	client.StartCall("name/of/object", "method1", []interface{}{})
+	client.StartCall(ctx, "name/of/object", "method1", []interface{}{})
 	if n := client.TimesCalled("method1"); n != 2 {
 		t.Errorf(errMsg, 2, n)
 		return
@@ -119,7 +124,7 @@
 		t.Errorf(errMsg, 0, n)
 		return
 	}
-	client.StartCall("name/of/object", "method2", []interface{}{})
+	client.StartCall(ctx, "name/of/object", "method2", []interface{}{})
 	if n := client.TimesCalled("method2"); n != 1 {
 		t.Errorf(errMsg, 1, n)
 		return
diff --git a/runtimes/google/vsync/initiator.go b/runtimes/google/vsync/initiator.go
index 7380819..a9a30f4 100644
--- a/runtimes/google/vsync/initiator.go
+++ b/runtimes/google/vsync/initiator.go
@@ -11,6 +11,7 @@
 	"veyron/services/store/raw"
 
 	"veyron2/naming"
+	"veyron2/rt"
 	"veyron2/storage"
 	"veyron2/vlog"
 )
@@ -198,7 +199,7 @@
 	vlog.VI(1).Infof("GetDeltasFromPeer:: Sending local information: %v", local)
 
 	// Issue a GetDeltas() rpc.
-	stream, err := c.GetDeltas(local, i.syncd.id)
+	stream, err := c.GetDeltas(rt.R().TODOContext(), local, i.syncd.id)
 	if err != nil {
 		vlog.Errorf("GetDeltasFromPeer:: error getting deltas: err %v", err)
 		return
@@ -504,7 +505,7 @@
 	// to prevent a race with watcher. The next iteration will
 	// clean up this coordination.
 	if store := i.syncd.store; store != nil && len(m) > 0 {
-		stream, err := store.PutMutations()
+		stream, err := store.PutMutations(rt.R().TODOContext())
 		if err != nil {
 			vlog.Errorf("updateStoreAndSync:: putmutations err %v", err)
 			return err
diff --git a/runtimes/google/vsync/vsync.vdl.go b/runtimes/google/vsync/vsync.vdl.go
index 35c2ec1..82037e2 100644
--- a/runtimes/google/vsync/vsync.vdl.go
+++ b/runtimes/google/vsync/vsync.vdl.go
@@ -77,7 +77,7 @@
 type Sync_ExcludingUniversal interface {
 	// GetDeltas returns a device's current generation vector and all the missing log records
 	// when compared to the incoming generation vector.
-	GetDeltas(In GenVector, ClientID DeviceID, opts ..._gen_ipc.ClientCallOpt) (reply SyncGetDeltasStream, err error)
+	GetDeltas(ctx _gen_ipc.Context, In GenVector, ClientID DeviceID, opts ..._gen_ipc.CallOpt) (reply SyncGetDeltasStream, err error)
 }
 type Sync interface {
 	_gen_ipc.UniversalServiceMethods
@@ -89,7 +89,7 @@
 
 	// GetDeltas returns a device's current generation vector and all the missing log records
 	// when compared to the incoming generation vector.
-	GetDeltas(context _gen_ipc.Context, In GenVector, ClientID DeviceID, stream SyncServiceGetDeltasStream) (reply GenVector, err error)
+	GetDeltas(context _gen_ipc.ServerContext, In GenVector, ClientID DeviceID, stream SyncServiceGetDeltasStream) (reply GenVector, err error)
 }
 
 // SyncGetDeltasStream is the interface for streaming responses of the method
@@ -110,7 +110,7 @@
 
 // Implementation of the SyncGetDeltasStream interface that is not exported.
 type implSyncGetDeltasStream struct {
-	clientCall _gen_ipc.ClientCall
+	clientCall _gen_ipc.Call
 }
 
 func (c *implSyncGetDeltasStream) Recv() (item LogRec, err error) {
@@ -189,18 +189,18 @@
 	name   string
 }
 
-func (__gen_c *clientStubSync) GetDeltas(In GenVector, ClientID DeviceID, opts ..._gen_ipc.ClientCallOpt) (reply SyncGetDeltasStream, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "GetDeltas", []interface{}{In, ClientID}, opts...); err != nil {
+func (__gen_c *clientStubSync) GetDeltas(ctx _gen_ipc.Context, In GenVector, ClientID DeviceID, opts ..._gen_ipc.CallOpt) (reply SyncGetDeltasStream, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "GetDeltas", []interface{}{In, ClientID}, opts...); err != nil {
 		return
 	}
 	reply = &implSyncGetDeltasStream{clientCall: call}
 	return
 }
 
-func (__gen_c *clientStubSync) UnresolveStep(opts ..._gen_ipc.ClientCallOpt) (reply []string, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "UnresolveStep", nil, opts...); err != nil {
+func (__gen_c *clientStubSync) UnresolveStep(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply []string, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "UnresolveStep", nil, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -209,9 +209,9 @@
 	return
 }
 
-func (__gen_c *clientStubSync) Signature(opts ..._gen_ipc.ClientCallOpt) (reply _gen_ipc.ServiceSignature, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "Signature", nil, opts...); err != nil {
+func (__gen_c *clientStubSync) Signature(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply _gen_ipc.ServiceSignature, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "Signature", nil, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -220,9 +220,9 @@
 	return
 }
 
-func (__gen_c *clientStubSync) GetMethodTags(method string, opts ..._gen_ipc.ClientCallOpt) (reply []interface{}, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "GetMethodTags", []interface{}{method}, opts...); err != nil {
+func (__gen_c *clientStubSync) GetMethodTags(ctx _gen_ipc.Context, method string, opts ..._gen_ipc.CallOpt) (reply []interface{}, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "GetMethodTags", []interface{}{method}, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
diff --git a/runtimes/google/vsync/vsyncd.go b/runtimes/google/vsync/vsyncd.go
index 2e6d639..a70de6e 100644
--- a/runtimes/google/vsync/vsyncd.go
+++ b/runtimes/google/vsync/vsyncd.go
@@ -158,7 +158,7 @@
 }
 
 // GetDeltas responds to the incoming request from a client by sending missing generations to the client.
-func (s *syncd) GetDeltas(_ ipc.Context, In GenVector, ClientID DeviceID, Stream SyncServiceGetDeltasStream) (GenVector, error) {
+func (s *syncd) GetDeltas(_ ipc.ServerContext, In GenVector, ClientID DeviceID, Stream SyncServiceGetDeltasStream) (GenVector, error) {
 	vlog.VI(1).Infof("GetDeltas:: Received vector %v from client %s", In, ClientID)
 
 	if err := s.updateDeviceInfo(ClientID, In); err != nil {
diff --git a/runtimes/google/vsync/watcher.go b/runtimes/google/vsync/watcher.go
index e081d7f..e44105c 100644
--- a/runtimes/google/vsync/watcher.go
+++ b/runtimes/google/vsync/watcher.go
@@ -14,6 +14,7 @@
 	"veyron2"
 	"veyron2/ipc"
 	"veyron2/query"
+	"veyron2/rt"
 	"veyron2/services/watch"
 	"veyron2/storage"
 	"veyron2/vlog"
@@ -101,7 +102,7 @@
 			req.ResumeMarker = resmark
 		}
 
-		stream, err := w.syncd.store.Watch(req, veyron2.CallTimeout(ipc.NoTimeout))
+		stream, err := w.syncd.store.Watch(rt.R().TODOContext(), req, veyron2.CallTimeout(ipc.NoTimeout))
 		if err == nil {
 			return stream
 		}
diff --git a/runtimes/google/vsync/watcher_test.go b/runtimes/google/vsync/watcher_test.go
index 30ea172..73b5af7 100644
--- a/runtimes/google/vsync/watcher_test.go
+++ b/runtimes/google/vsync/watcher_test.go
@@ -13,6 +13,7 @@
 	"veyron/services/store/raw"
 
 	"veyron2/ipc"
+	"veyron2/rt"
 	"veyron2/services/watch"
 	"veyron2/storage"
 )
@@ -38,19 +39,19 @@
 type fakeVStore struct {
 }
 
-func (*fakeVStore) GetMethodTags(_ string, _ ...ipc.ClientCallOpt) ([]interface{}, error) {
+func (*fakeVStore) GetMethodTags(_ ipc.Context, _ string, _ ...ipc.CallOpt) ([]interface{}, error) {
 	panic("not implemented")
 }
 
-func (*fakeVStore) UnresolveStep(_ ...ipc.ClientCallOpt) ([]string, error) {
+func (*fakeVStore) UnresolveStep(_ ipc.Context, _ ...ipc.CallOpt) ([]string, error) {
 	panic("not implemented")
 }
 
-func (*fakeVStore) Signature(_ ...ipc.ClientCallOpt) (ipc.ServiceSignature, error) {
+func (*fakeVStore) Signature(_ ipc.Context, _ ...ipc.CallOpt) (ipc.ServiceSignature, error) {
 	panic("not implemented")
 }
 
-func (v *fakeVStore) Watch(req watch.Request, _ ...ipc.ClientCallOpt) (watch.WatcherWatchStream, error) {
+func (v *fakeVStore) Watch(_ ipc.Context, req watch.Request, _ ...ipc.CallOpt) (watch.WatcherWatchStream, error) {
 	// If "failWatch" is set, simulate a failed RPC call.
 	if info.failWatch {
 		info.failWatchCount++
@@ -64,7 +65,7 @@
 	return newFakeStream(), nil
 }
 
-func (*fakeVStore) PutMutations(_ ...ipc.ClientCallOpt) (raw.StorePutMutationsStream, error) {
+func (*fakeVStore) PutMutations(_ ipc.Context, _ ...ipc.CallOpt) (raw.StorePutMutationsStream, error) {
 	panic("not implemented")
 }
 
@@ -287,6 +288,7 @@
 // TestWatcherRPCError tests the watcher reacting to an error from the Watch() RPC.
 // It verifies that the watcher retries the RPC after a delay.
 func TestWatcherRPCError(t *testing.T) {
+	rt.Init()
 	dir := initTestDir(t)
 	defer os.RemoveAll(dir)
 
diff --git a/services/config/lib/config.go b/services/config/lib/config.go
new file mode 100644
index 0000000..32b0217
--- /dev/null
+++ b/services/config/lib/config.go
@@ -0,0 +1,403 @@
+// A mdns based config service.  We make an mdns group for each config.
+// Mdns is probably an over kill for this but why use two when one will do?
+
+// The service provides an eventually consistent map to all nodes on the
+// network.  The winning map is the one with the highest version number.
+// If a server stores the map in a file, it can also be a source of the
+// map
+
+package config
+
+import (
+	"fmt"
+	"io/ioutil"
+	"path/filepath"
+	"sort"
+	"strconv"
+	"strings"
+	"sync"
+
+	"veyron2/verror"
+	"veyron2/vlog"
+
+	"code.google.com/p/mdns"
+	"code.google.com/p/mdns/go_dns"
+)
+
+const maxDNSStringLength = 254
+
+type config struct {
+	version uint64
+	pairs   map[string]string
+}
+
+type configService struct {
+	rwlock  sync.RWMutex // protects elements of this structure.
+	atomic  sync.RWMutex // ties together setting config below and writing the file.
+	mdns    *mdns.MDNS
+	service string
+	file    string     // file containing config
+	current *config    // the highest numbered config
+	done    chan bool  // closed to tell children to go away
+	change  *sync.Cond // condition variable broadcast to on every config change
+	gen     int        // incremented every config change
+}
+
+// MDNSConfigService creates a new instance of the config service with the given name.
+// If file is non blank, the initial config is read from file and any learned configs are
+// stored in it.  Only instances with a file to backup will offer configs to the net.
+// All other instances are passive.
+func MDNSConfigService(name, file string, loopback bool) (ConfigService, error) {
+	x := filepath.Base(file)
+	if x == "." {
+		x = ""
+	}
+	mdns, err := mdns.NewMDNS(x, "", "", loopback, false)
+	if err != nil {
+		vlog.Errorf("mdns startup failed: %s", err)
+		return nil, err
+	}
+	cs := &configService{mdns: mdns, service: name + "-config", file: file, done: make(chan bool)}
+	cs.change = sync.NewCond(&cs.rwlock)
+
+	// Read the config file if we have one and offer it to everyone else.
+	if cs.current, err = readFile(file); err != nil {
+		vlog.Errorf("reading initial config: %s", err)
+	}
+	cs.Offer()
+
+	// Watch config changes and remember them.
+	go cs.watcher()
+	return cs, nil
+}
+
+// Stop the service.
+func (cs *configService) Stop() {
+	cs.rwlock.Lock()
+	mdns := cs.mdns
+	cs.mdns = nil
+	c := cs.done
+	cs.done = nil
+	cs.rwlock.Unlock()
+
+	if c != nil {
+		close(c)
+	}
+	if mdns != nil {
+		mdns.Stop()
+	}
+}
+
+func newConfig() *config {
+	return &config{pairs: make(map[string]string)}
+}
+
+// parseVersion parses a config version.  The version is a pair of uint32s separated by a '.'.
+// If the second is missing, we assume 0.  The first number is for humans.  The
+// second is to break ties if machines generate configs.
+func parseVersion(s string) (uint64, error) {
+	f := strings.SplitN(s, ".", 2)
+	v, err := strconv.ParseUint(f[0], 10, 32)
+	if err != nil {
+		return 0, err
+	}
+	var r uint64
+	if len(f) == 2 {
+		r, err = strconv.ParseUint(f[1], 10, 32)
+		if err != nil {
+			return 0, err
+		}
+	}
+	return (v << 32) | r, nil
+}
+
+func serializeVersion(version uint64) string {
+	return fmt.Sprintf("%d.%d", version>>32, version&0xffffffff)
+}
+
+// parseEntry parse an entry of the form "key : value" and
+// add it to the map.  White space before and after "key" and
+// value is discarded.
+func (c *config) parseEntry(l string) error {
+	// Ignore lines with nothing but white space or starting with #
+	l = strings.TrimSpace(l)
+	if len(l) == 0 || strings.HasPrefix(l, "#") {
+		return nil
+	}
+	// The reset have to be key<white>*:<white>*value
+	f := strings.SplitN(l, ":", 2)
+	if len(f) != 2 {
+		return verror.BadArgf("can't parse %s", l)
+	}
+	k := strings.TrimSpace(f[0])
+	v := strings.TrimSpace(f[1])
+	if len(k)+len(v) > maxDNSStringLength {
+		return verror.BadArgf("entry %s:%s is too long", k, v)
+	}
+	c.pairs[k] = v
+	if k != "version" {
+		return nil
+	}
+	var err error
+	c.version, err = parseVersion(v)
+	return err
+}
+
+func serializeEntry(k, v string) (string, error) {
+	if len(k)+len(v) > maxDNSStringLength {
+		return "", verror.BadArgf("entry %s:%s is too long", k, v)
+	}
+	return k + ":" + v, nil
+}
+
+func readFile(file string) (*config, error) {
+	if len(file) == 0 {
+		return nil, verror.NotFoundf("no file to read")
+	}
+
+	// The config has to be small so just read it all in one go.
+	b, err := ioutil.ReadFile(file)
+	if err != nil {
+		return nil, err
+	}
+	c := newConfig()
+	for _, l := range strings.Split(string(b), "\n") {
+		if err := c.parseEntry(l); err != nil {
+			return nil, verror.BadArgf("file %s: %s", file, err)
+		}
+	}
+	if _, ok := c.pairs["version"]; !ok {
+		return nil, verror.BadArgf("file %s: missing legal version", file)
+	}
+	return c, nil
+}
+
+// writeFile is called with the write lock held.
+func writeFile(file string, c *config) {
+	if len(file) == 0 || c == nil || len(c.pairs) == 0 {
+		return
+	}
+	var s string
+	for k, v := range c.pairs {
+		e, err := serializeEntry(k, v)
+		if err != nil {
+			vlog.Errorf("writing %s: %s", file, err)
+			return
+		}
+		s += e + "\n"
+	}
+	if err := ioutil.WriteFile(file, []byte(s), 0644); err != nil {
+		vlog.Errorf("writing %s: %q", file, err)
+	}
+}
+
+// rrToConfig converts a set of TXT rrs to a config.
+func rrToConfig(rr *dns.RR_TXT) (*config, error) {
+	c := newConfig()
+	for _, s := range rr.Txt {
+		if err := c.parseEntry(s); err != nil {
+			return nil, err
+		}
+	}
+	// Ignore any config with no version.
+	if _, ok := c.pairs["version"]; !ok {
+		return nil, verror.NotFoundf("missing config version")
+	}
+	return c, nil
+}
+
+func (cs *configService) watchSingle(key string, c chan Pair) {
+	ov, err := cs.Get(key)
+	oexists := err == nil
+	c <- Pair{Key: key, Value: ov, Nonexistant: !oexists}
+	gen := 0
+	for {
+		v, err := cs.Get(key)
+		exists := err == nil
+		if exists != oexists || v != ov {
+			c <- Pair{Key: key, Value: v, Nonexistant: !exists}
+			ov, oexists = v, exists
+		}
+		// Block waiting for a change.
+		cs.rwlock.Lock()
+		for gen == cs.gen {
+			cs.change.Wait()
+		}
+		gen = cs.gen
+		cs.rwlock.Unlock()
+	}
+}
+
+func (cs *configService) watchAll(c chan Pair) {
+	omap := make(map[string]string, 0)
+	gen := 0
+	for {
+		nmap, err := cs.GetAll()
+		if err != nil {
+			nmap = make(map[string]string, 0)
+		}
+		// See if any key disappeared.
+		for k := range omap {
+			if _, ok := nmap[k]; !ok {
+				c <- Pair{Key: k, Value: "", Nonexistant: true}
+			}
+		}
+		// See if any value changed or new key appeared.
+		for k, v := range nmap {
+			ov, ok := omap[k]
+			if !ok || v != ov {
+				c <- Pair{Key: k, Value: v}
+			}
+		}
+		omap = nmap
+		// Block waiting for a change.
+		cs.rwlock.Lock()
+		for gen == cs.gen {
+			cs.change.Wait()
+		}
+		gen = cs.gen
+		cs.rwlock.Unlock()
+	}
+}
+
+// watcher waits for config changes and remembers them.
+// TODO(p): Should we also watch the file for changes?
+func (cs *configService) watcher() {
+	cs.rwlock.RLock()
+	c := cs.mdns.ServiceMemberWatch(cs.service)
+	cs.mdns.SubscribeToService(cs.service)
+	cs.rwlock.RUnlock()
+	for {
+		select {
+		case si := <-c:
+			var config *config
+			for _, rr := range si.TxtRRs {
+				c, err := rrToConfig(rr)
+				if err != nil {
+					continue
+				}
+				if config == nil || c.version > config.version {
+					config = c
+				}
+			}
+			if config == nil {
+				continue
+			}
+			// This lock is to synchronize writing and reading of the data structure.
+			cs.rwlock.Lock()
+			if cs.current != nil && config.version <= cs.current.version {
+				cs.rwlock.Unlock()
+				continue
+			}
+			// This lock is to tie setting the data structure and writing the file into an atomic operation.
+			cs.atomic.Lock()
+			cs.current = config
+			cs.gen++
+			cs.change.Broadcast()
+			cs.rwlock.Unlock()
+			writeFile(cs.file, cs.current)
+			cs.atomic.Unlock()
+			cs.Offer()
+		case <-cs.done:
+			break
+		}
+	}
+	close(c)
+	return
+}
+
+// Get returns the value associated with key.
+func (cs *configService) Get(key string) (string, error) {
+	cs.rwlock.RLock()
+	defer cs.rwlock.RUnlock()
+	if cs.current == nil {
+		return "", verror.NotFoundf("no config")
+	}
+	if v, ok := cs.current.pairs[key]; !ok {
+		return "", verror.NotFoundf("config has no key %q", key)
+	} else {
+		return v, nil
+	}
+}
+
+// Watch for changes to a particular key.
+func (cs *configService) Watch(key string) chan Pair {
+	c := make(chan Pair)
+	go cs.watchSingle(key, c)
+	return c
+}
+
+// Get returns the complete configuration.
+func (cs *configService) GetAll() (map[string]string, error) {
+	cs.rwlock.RLock()
+	defer cs.rwlock.RUnlock()
+	if cs.current == nil {
+		return nil, verror.NotFoundf("no config found")
+	}
+	// Copy so caller can't change the map under our feet.
+	reply := make(map[string]string)
+	for k, v := range cs.current.pairs {
+		reply[k] = v
+	}
+	return reply, nil
+}
+
+// WatchAll watches for changes to any key.
+func (cs *configService) WatchAll() chan Pair {
+	c := make(chan Pair)
+	go cs.watchAll(c)
+	return c
+}
+
+// Offer offers the pairs for the config to other servers.
+func (cs *configService) Offer() {
+	cs.rwlock.RLock()
+	defer cs.rwlock.RUnlock()
+	if cs.mdns == nil || cs.current == nil || len(cs.file) == 0 {
+		return
+	}
+	// First sort the keys to get a canonical list for the txt entries.
+	keys := make([]string, 0)
+	for k := range cs.current.pairs {
+		keys = append(keys, k)
+	}
+	sort.Strings(keys)
+	// Convert config to a slice of strings.
+	var txt []string
+	for _, k := range keys {
+		e, err := serializeEntry(k, cs.current.pairs[k])
+		if err != nil {
+			verror.NotFoundf("offering config: %s", cs.file, err)
+			return
+		}
+		txt = append(txt, e)
+	}
+
+	// Send (and keep sending).
+	cs.mdns.AddService(cs.service, "", 0, txt...)
+}
+
+// Reread the config file and remember it if the version is newer than current.
+func (cs *configService) Reread() error {
+	cs.rwlock.RLock()
+	file := cs.file
+	cs.rwlock.RUnlock()
+	if len(file) == 0 {
+		return nil
+	}
+	c, err := readFile(file)
+	if err != nil {
+		return err
+	}
+	cs.rwlock.Lock()
+	if cs.current != nil && c.version <= cs.current.version {
+		cs.rwlock.Unlock()
+		return nil
+	}
+	cs.current = c
+	cs.gen++
+	cs.change.Broadcast()
+	cs.rwlock.Unlock()
+	cs.Offer()
+	return nil
+}
diff --git a/services/config/lib/config_test.go b/services/config/lib/config_test.go
new file mode 100644
index 0000000..ea6a939
--- /dev/null
+++ b/services/config/lib/config_test.go
@@ -0,0 +1,311 @@
+package config
+
+import (
+	"errors"
+	"fmt"
+	"io/ioutil"
+	"os"
+	"testing"
+	"time"
+)
+
+// A config file to be written to disk.
+var configFileA = `
+the:rain
+ in:spain
+falls: mainly
+ on : the 
+# something ugly this way comes
+plain:	today
+version : 1
+`
+
+// A map referring to the config in configFileA.
+var referenceA = map[string]string{
+	"the":     "rain",
+	"in":      "spain",
+	"falls":   "mainly",
+	"on":      "the",
+	"plain":   "today",
+	"version": "1",
+}
+
+// Another config file to be written to disk.
+var configFileB = `
+the:rain
+ in:spain
+falls: mainly
+ on : my foot 
+# something ugly this way comes
+version : 1.1
+`
+
+// A map referring to the config in configFileB.
+var referenceB = map[string]string{
+	"the":     "rain",
+	"in":      "spain",
+	"falls":   "mainly",
+	"on":      "my foot",
+	"version": "1.1",
+}
+
+func compare(actual map[string]string, reference map[string]string) error {
+	for k, rv := range reference {
+		av, ok := actual[k]
+		if !ok {
+			return fmt.Errorf("missing entry for key %q", k)
+		}
+		if av != rv {
+			return fmt.Errorf("bad value for key %q: expected %q, got %q", k, rv, av)
+		}
+	}
+	for k, av := range actual {
+		if _, ok := reference[k]; !ok {
+			return fmt.Errorf("unexpected pair %q : %q", k, av)
+		}
+	}
+	return nil
+}
+
+func compareConfigToReference(cs ConfigService, ref map[string]string) error {
+	actual, err := cs.GetAll()
+	if err != nil {
+		return err
+	}
+	return compare(actual, ref)
+}
+
+func compareFileToReference(file string, ref map[string]string) error {
+	c, err := readFile(file)
+	if err != nil {
+		return err
+	}
+	return compare(c.pairs, ref)
+}
+
+func waitForConsistency(cs ConfigService, ref map[string]string) error {
+	finalerr := errors.New("inconsistent")
+	for loops := 0; loops < 20; loops++ {
+		actual, err := cs.GetAll()
+		if err == nil {
+			err := compare(actual, ref)
+			if err == nil {
+				return nil
+			}
+			finalerr = err
+		}
+		time.Sleep(500 * time.Millisecond)
+	}
+	return finalerr
+}
+
+func testConfig(fileA, fileB, fileD string) error {
+	// Write a config to fileA.
+	if err := ioutil.WriteFile(fileA, []byte(configFileA), 0644); err != nil {
+		return fmt.Errorf("writing initial %s: %s", fileA, err)
+	}
+
+	// Start a config service with a file and compare the parsed file to the reference.
+	csa, err := MDNSConfigService("foo", fileA, true)
+	if err != nil {
+		return fmt.Errorf("creating service %s", err)
+	}
+	defer csa.Stop()
+	if err := compareConfigToReference(csa, referenceA); err != nil {
+		return fmt.Errorf("confA ~ refA: %s", err)
+	}
+
+	// Create a second instance with a non existant file.
+	csb, err := MDNSConfigService("foo", fileB, true)
+	if err != nil {
+		return fmt.Errorf("creating service %s", err)
+	}
+	defer csb.Stop()
+
+	// Create a third passive instance with no file.
+	csc, err := MDNSConfigService("foo", "", true)
+	if err != nil {
+		return fmt.Errorf("creating service %s", err)
+	}
+	defer csc.Stop()
+
+	// Loop till the second instance gets a config or we time out.
+	if err := waitForConsistency(csb, referenceA); err != nil {
+		return fmt.Errorf("confB ~ refA: %s", err)
+	}
+
+	// Make sure that the new instance updated its file.
+	if err := compareFileToReference(fileB, referenceA); err != nil {
+		return fmt.Errorf("fileB ~ refA: %s", err)
+	}
+
+	// Rewrite/Reread the second instance's file, make sure the it rereads it correctly.
+	if err := ioutil.WriteFile(fileB, []byte(configFileB), 0644); err != nil {
+		return fmt.Errorf("writing fileB: %s", err)
+	}
+	if err := csb.Reread(); err != nil {
+		return fmt.Errorf("Rereading fileB: %s", err)
+	}
+	if err := compareConfigToReference(csb, referenceB); err != nil {
+		return fmt.Errorf("confB ~ refB: %s", err)
+	}
+	// Loop till the first instance changes its config or we time out.
+	if err := waitForConsistency(csa, referenceB); err != nil {
+		return fmt.Errorf("confA ~ refB: %s", err)
+	}
+
+	// Make sure that the first instance updated its file.
+	if err := compareFileToReference(fileA, referenceB); err != nil {
+		return fmt.Errorf("fileA ~ refB: %s", err)
+	}
+
+	// Loop till the passive instance changes its config or we time out.
+	if err := waitForConsistency(csc, referenceB); err != nil {
+		return fmt.Errorf("confC ~ refB: %s", err)
+	}
+
+	// Create an instance with an lower numbered version.  Make sure it doesn't
+	// overcome the higher numbered one.
+	if err := ioutil.WriteFile(fileD, []byte(configFileA), 0644); err != nil {
+		return fmt.Errorf("writing initial %s: %s", fileD, err)
+	}
+	csd, err := MDNSConfigService("foo", fileD, true)
+	if err != nil {
+		return fmt.Errorf("creating service %s", err)
+	}
+	defer csd.Stop()
+	if err := waitForConsistency(csd, referenceB); err != nil {
+		return fmt.Errorf("confD ~ refB: %s", err)
+	}
+	if err := waitForConsistency(csc, referenceA); err == nil {
+		return errors.New("eventual consistency picked wrong version for C")
+	}
+
+	return nil
+}
+
+func createTempFile(t *testing.T, base string) string {
+	f, err := ioutil.TempFile("", base)
+	if err != nil {
+		t.Fatal("creating temp file: %s", err)
+	}
+	f.Close()
+	return f.Name()
+}
+
+func TestConfig(t *testing.T) {
+	// Create temporary files.
+	fileA := createTempFile(t, "testconfigA")
+	defer os.Remove(fileA)
+	fileB := createTempFile(t, "testconfigB")
+	defer os.Remove(fileB)
+	fileD := createTempFile(t, "testconfigD")
+	defer os.Remove(fileD)
+
+	if err := testConfig(fileA, fileB, fileD); err != nil {
+		t.Fatal(err)
+	}
+}
+
+func TestConfigStream(t *testing.T) {
+	// Create temporary file.
+	fileA := createTempFile(t, "testconfigA")
+	defer os.Remove(fileA)
+
+	// Start a cs service.
+	cs, err := MDNSConfigService("foo", fileA, true)
+	if err != nil {
+		t.Fatal("creating service %s", err)
+	}
+
+	// Watch a single key and all keys.
+	ws := cs.Watch("version")
+	wa := cs.WatchAll()
+
+	// Since there's no config yet, we should just get a
+	// deleted entry for the single key.
+	select {
+	case p := <-ws:
+		if !p.Nonexistant {
+			t.Fatal("expected Nonexistant: got %v", p)
+		}
+	case <-time.After(2 * time.Second):
+		t.Fatal("timeout waiting for single config var")
+	}
+
+	// Write a config to the file and read it.
+	if err := ioutil.WriteFile(fileA, []byte(configFileA), 0644); err != nil {
+		t.Fatal("writing initial %s: %s", fileA, err)
+	}
+	if err := cs.Reread(); err != nil {
+		t.Fatal("rereading config: %s", err)
+	}
+
+	// We should now have a version number.
+	select {
+	case p := <-ws:
+		if p.Nonexistant || p.Key != "version" || p.Value != "1" {
+			t.Fatal("expected [version, 1, false]: got %v", p)
+		}
+
+	case <-time.After(2 * time.Second):
+		t.Fatal("timeout waiting for single config var")
+	}
+
+	// And we should be streamed the whole version.
+	cmap := make(map[string]string, 0)
+L:
+	for {
+		select {
+		case p := <-wa:
+			if p.Nonexistant {
+				t.Fatal("unexpected %v", p)
+			}
+			cmap[p.Key] = p.Value
+			err := compare(referenceA, cmap)
+			if err == nil {
+				break L
+			}
+		case <-time.After(2 * time.Second):
+			t.Fatal("timeout waiting for all config vars")
+		}
+	}
+
+	// Change and reread the config file.
+	if err := ioutil.WriteFile(fileA, []byte(configFileB), 0644); err != nil {
+		t.Fatal("writing initial %s: %s", fileA, err)
+	}
+	if err := cs.Reread(); err != nil {
+		t.Fatal("rereading config: %s", err)
+	}
+
+	// The version should have changed.
+	select {
+	case p := <-ws:
+		if p.Nonexistant || p.Key != "version" || p.Value != "1.1" {
+			t.Fatal("expected [version, 1.1, false]: got %v", p)
+		}
+
+	case <-time.After(2 * time.Second):
+		t.Fatal("timeout waiting for single config var")
+	}
+
+	// And we should now be consistent with referenceB
+L2:
+	for {
+		select {
+		case p := <-wa:
+			if p.Nonexistant {
+				delete(cmap, p.Key)
+				break
+			}
+			cmap[p.Key] = p.Value
+			err := compare(referenceB, cmap)
+			if err == nil {
+				break L2
+			}
+		case <-time.After(2 * time.Second):
+			t.Fatal("timeout waiting for all config vars")
+		}
+	}
+}
diff --git a/services/config/lib/model.go b/services/config/lib/model.go
new file mode 100644
index 0000000..92aa459
--- /dev/null
+++ b/services/config/lib/model.go
@@ -0,0 +1,37 @@
+package config
+
+// ConfigService exists to get things going when you plug a device into a network.
+// Anything that we currently pass to apps as environment variables (proxy server,
+// global name server, ...) should come from here.
+
+// Both keys and values can have embedded white space but they can't start
+// or end with whitespace.  keys cannot include ':'s.
+
+type Pair struct {
+	Key         string
+	Value       string
+	Nonexistant bool
+}
+
+type ConfigService interface {
+	// Stop stops a config service.
+	Stop()
+
+	// Get returns the value associated with name or an error if no value exists
+	// or can be determined.
+	Get(name string) (string, error)
+
+	// GetAll returns all attribute/value pairs as a map or an error if no config
+	// can be found.
+	GetAll() (map[string]string, error)
+
+	// Watch returns a stream of values for a particuar key.
+	Watch(key string) chan Pair
+
+	// Watch returns a stream key, value pairs.
+	WatchAll() chan Pair
+
+	// Reread the config info (for example, from a file).  In particular
+	// this says nothing about where the config resides or how it is read.
+	Reread() error
+}
diff --git a/services/mgmt/application/application.vdl.go b/services/mgmt/application/application.vdl.go
index 1242569..3e54da9 100644
--- a/services/mgmt/application/application.vdl.go
+++ b/services/mgmt/application/application.vdl.go
@@ -44,7 +44,7 @@
 	// Put adds the given tuple of application version (specified
 	// through the veyron name suffix) and application envelope to all
 	// of the given application profiles.
-	Put(Profiles []string, Envelope application.Envelope, opts ..._gen_ipc.ClientCallOpt) (err error)
+	Put(ctx _gen_ipc.Context, Profiles []string, Envelope application.Envelope, opts ..._gen_ipc.CallOpt) (err error)
 	// Remove removes the application envelope for the given profile
 	// name and application version (specified through the veyron name
 	// suffix). If no version is specified as part of the suffix, the
@@ -52,7 +52,7 @@
 	//
 	// TODO(jsimsa): Add support for using "*" to specify all profiles
 	// when Matt implements Globing (or Ken implements querying).
-	Remove(Profile string, opts ..._gen_ipc.ClientCallOpt) (err error)
+	Remove(ctx _gen_ipc.Context, Profile string, opts ..._gen_ipc.CallOpt) (err error)
 }
 type Repository interface {
 	_gen_ipc.UniversalServiceMethods
@@ -80,7 +80,7 @@
 	// Put adds the given tuple of application version (specified
 	// through the veyron name suffix) and application envelope to all
 	// of the given application profiles.
-	Put(context _gen_ipc.Context, Profiles []string, Envelope application.Envelope) (err error)
+	Put(context _gen_ipc.ServerContext, Profiles []string, Envelope application.Envelope) (err error)
 	// Remove removes the application envelope for the given profile
 	// name and application version (specified through the veyron name
 	// suffix). If no version is specified as part of the suffix, the
@@ -88,7 +88,7 @@
 	//
 	// TODO(jsimsa): Add support for using "*" to specify all profiles
 	// when Matt implements Globing (or Ken implements querying).
-	Remove(context _gen_ipc.Context, Profile string) (err error)
+	Remove(context _gen_ipc.ServerContext, Profile string) (err error)
 }
 
 // BindRepository returns the client stub implementing the Repository
@@ -138,9 +138,9 @@
 	name   string
 }
 
-func (__gen_c *clientStubRepository) Put(Profiles []string, Envelope application.Envelope, opts ..._gen_ipc.ClientCallOpt) (err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "Put", []interface{}{Profiles, Envelope}, opts...); err != nil {
+func (__gen_c *clientStubRepository) Put(ctx _gen_ipc.Context, Profiles []string, Envelope application.Envelope, opts ..._gen_ipc.CallOpt) (err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "Put", []interface{}{Profiles, Envelope}, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&err); ierr != nil {
@@ -149,9 +149,9 @@
 	return
 }
 
-func (__gen_c *clientStubRepository) Remove(Profile string, opts ..._gen_ipc.ClientCallOpt) (err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "Remove", []interface{}{Profile}, opts...); err != nil {
+func (__gen_c *clientStubRepository) Remove(ctx _gen_ipc.Context, Profile string, opts ..._gen_ipc.CallOpt) (err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "Remove", []interface{}{Profile}, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&err); ierr != nil {
@@ -160,9 +160,9 @@
 	return
 }
 
-func (__gen_c *clientStubRepository) UnresolveStep(opts ..._gen_ipc.ClientCallOpt) (reply []string, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "UnresolveStep", nil, opts...); err != nil {
+func (__gen_c *clientStubRepository) UnresolveStep(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply []string, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "UnresolveStep", nil, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -171,9 +171,9 @@
 	return
 }
 
-func (__gen_c *clientStubRepository) Signature(opts ..._gen_ipc.ClientCallOpt) (reply _gen_ipc.ServiceSignature, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "Signature", nil, opts...); err != nil {
+func (__gen_c *clientStubRepository) Signature(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply _gen_ipc.ServiceSignature, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "Signature", nil, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -182,9 +182,9 @@
 	return
 }
 
-func (__gen_c *clientStubRepository) GetMethodTags(method string, opts ..._gen_ipc.ClientCallOpt) (reply []interface{}, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "GetMethodTags", []interface{}{method}, opts...); err != nil {
+func (__gen_c *clientStubRepository) GetMethodTags(ctx _gen_ipc.Context, method string, opts ..._gen_ipc.CallOpt) (reply []interface{}, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "GetMethodTags", []interface{}{method}, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
diff --git a/services/mgmt/application/impl/impl_test.go b/services/mgmt/application/impl/impl_test.go
index c80ddc7..4783058 100644
--- a/services/mgmt/application/impl/impl_test.go
+++ b/services/mgmt/application/impl/impl_test.go
@@ -16,6 +16,7 @@
 // the Application interface.
 func TestInterface(t *testing.T) {
 	runtime := rt.Init()
+	ctx := runtime.NewContext()
 	defer runtime.Shutdown()
 
 	// Setup and start the application manager server.
@@ -69,71 +70,71 @@
 	}
 
 	// Test Put(), adding a number of application envelopes.
-	if err := stubV1.Put([]string{"base", "media"}, envelopeV1); err != nil {
+	if err := stubV1.Put(ctx, []string{"base", "media"}, envelopeV1); err != nil {
 		t.Fatalf("Put() failed: %v", err)
 	}
-	if err := stubV2.Put([]string{"base"}, envelopeV2); err != nil {
+	if err := stubV2.Put(ctx, []string{"base"}, envelopeV2); err != nil {
 		t.Fatalf("Put() failed: %v", err)
 	}
-	if err := stub.Put([]string{"base", "media"}, envelopeV1); err == nil || err.Error() != errInvalidSuffix.Error() {
+	if err := stub.Put(ctx, []string{"base", "media"}, envelopeV1); err == nil || err.Error() != errInvalidSuffix.Error() {
 		t.Fatalf("Unexpected error: expected %v, got %v", errInvalidSuffix, err)
 	}
 
 	// Test Match(), trying to retrieve both existing and non-existing
 	// application envelopes.
 	var output application.Envelope
-	if output, err = stubV2.Match([]string{"base", "media"}); err != nil {
+	if output, err = stubV2.Match(ctx, []string{"base", "media"}); err != nil {
 		t.Fatalf("Match() failed: %v", err)
 	}
 	if !reflect.DeepEqual(envelopeV2, output) {
 		t.Fatalf("Incorrect output: expected %v, got %v", envelopeV2, output)
 	}
-	if output, err = stubV1.Match([]string{"media"}); err != nil {
+	if output, err = stubV1.Match(ctx, []string{"media"}); err != nil {
 		t.Fatalf("Match() failed: %v", err)
 	}
 	if !reflect.DeepEqual(envelopeV1, output) {
 		t.Fatalf("Unexpected output: expected %v, got %v", envelopeV1, output)
 	}
-	if _, err := stubV2.Match([]string{"media"}); err == nil || err.Error() != errNotFound.Error() {
+	if _, err := stubV2.Match(ctx, []string{"media"}); err == nil || err.Error() != errNotFound.Error() {
 		t.Fatalf("Unexpected error: expected %v, got %v", errNotFound, err)
 	}
-	if _, err := stubV2.Match([]string{}); err == nil || err.Error() != errNotFound.Error() {
+	if _, err := stubV2.Match(ctx, []string{}); err == nil || err.Error() != errNotFound.Error() {
 		t.Fatalf("Unexpected error: expected %v, got %v", errNotFound, err)
 	}
-	if _, err := stub.Match([]string{"media"}); err == nil || err.Error() != errInvalidSuffix.Error() {
+	if _, err := stub.Match(ctx, []string{"media"}); err == nil || err.Error() != errInvalidSuffix.Error() {
 		t.Fatalf("Unexpected error: expected %v, got %v", errInvalidSuffix, err)
 	}
 
 	// Test Remove(), trying to remove both existing and non-existing
 	// application envelopes.
-	if err := stubV1.Remove("base"); err != nil {
+	if err := stubV1.Remove(ctx, "base"); err != nil {
 		t.Fatalf("Remove() failed: %v", err)
 	}
-	if output, err = stubV1.Match([]string{"media"}); err != nil {
+	if output, err = stubV1.Match(ctx, []string{"media"}); err != nil {
 		t.Fatalf("Match() failed: %v", err)
 	}
-	if err := stubV1.Remove("base"); err == nil || err.Error() != errNotFound.Error() {
+	if err := stubV1.Remove(ctx, "base"); err == nil || err.Error() != errNotFound.Error() {
 		t.Fatalf("Unexpected error: expected %v, got %v", errNotFound, err)
 	}
-	if err := stub.Remove("base"); err != nil {
+	if err := stub.Remove(ctx, "base"); err != nil {
 		t.Fatalf("Remove() failed: %v", err)
 	}
-	if err := stubV2.Remove("media"); err == nil || err.Error() != errNotFound.Error() {
+	if err := stubV2.Remove(ctx, "media"); err == nil || err.Error() != errNotFound.Error() {
 		t.Fatalf("Unexpected error: expected %v, got %v", errNotFound, err)
 	}
-	if err := stubV1.Remove("media"); err != nil {
+	if err := stubV1.Remove(ctx, "media"); err != nil {
 		t.Fatalf("Remove() failed: %v", err)
 	}
 
 	// Finally, use Match() to test that Remove really removed the
 	// application envelopes.
-	if _, err := stubV1.Match([]string{"base"}); err == nil || err.Error() != errNotFound.Error() {
+	if _, err := stubV1.Match(ctx, []string{"base"}); err == nil || err.Error() != errNotFound.Error() {
 		t.Fatalf("Unexpected error: expected %v, got %v", errNotFound, err)
 	}
-	if _, err := stubV1.Match([]string{"media"}); err == nil || err.Error() != errNotFound.Error() {
+	if _, err := stubV1.Match(ctx, []string{"media"}); err == nil || err.Error() != errNotFound.Error() {
 		t.Fatalf("Unexpected error: expected %v, got %v", errNotFound, err)
 	}
-	if _, err := stubV2.Match([]string{"base"}); err == nil || err.Error() != errNotFound.Error() {
+	if _, err := stubV2.Match(ctx, []string{"base"}); err == nil || err.Error() != errNotFound.Error() {
 		t.Fatalf("Unexpected error: expected %v, got %v", errNotFound, err)
 	}
 
diff --git a/services/mgmt/application/impl/invoker.go b/services/mgmt/application/impl/invoker.go
index 6273e54..4ec02e0 100644
--- a/services/mgmt/application/impl/invoker.go
+++ b/services/mgmt/application/impl/invoker.go
@@ -51,13 +51,13 @@
 type dir struct{}
 
 // makeParentNodes creates the parent nodes if they do not already exist.
-func makeParentNodes(store storage.Store, transaction storage.Transaction, path string) error {
+func makeParentNodes(context ipc.ServerContext, store storage.Store, transaction storage.Transaction, path string) error {
 	pathComponents := storage.ParsePath(path)
 	for i := 0; i < len(pathComponents); i++ {
 		name := pathComponents[:i].String()
 		object := store.Bind(name)
-		if _, err := object.Get(transaction); err != nil {
-			if _, err := object.Put(transaction, &dir{}); err != nil {
+		if _, err := object.Get(context, transaction); err != nil {
+			if _, err := object.Put(context, transaction, &dir{}); err != nil {
 				return errOperationFailed
 			}
 		}
@@ -65,7 +65,7 @@
 	return nil
 }
 
-func (i *invoker) Match(context ipc.Context, profiles []string) (application.Envelope, error) {
+func (i *invoker) Match(context ipc.ServerContext, profiles []string) (application.Envelope, error) {
 	vlog.VI(0).Infof("%v.Match(%v)", i.suffix, profiles)
 	empty := application.Envelope{}
 	name, version, err := parse(i.suffix)
@@ -78,7 +78,7 @@
 	for _, profile := range profiles {
 		path := path.Join("/applications", name, profile, version)
 		object := i.store.Bind(path)
-		entry, err := object.Get(nil)
+		entry, err := object.Get(context, nil)
 		if err != nil {
 			continue
 		}
@@ -91,7 +91,7 @@
 	return empty, errNotFound
 }
 
-func (i *invoker) Put(context ipc.Context, profiles []string, envelope application.Envelope) error {
+func (i *invoker) Put(context ipc.ServerContext, profiles []string, envelope application.Envelope) error {
 	vlog.VI(0).Infof("%v.Put(%v, %v)", i.suffix, profiles, envelope)
 	name, version, err := parse(i.suffix)
 	if err != nil {
@@ -100,53 +100,53 @@
 	if version == "" {
 		return errInvalidSuffix
 	}
-	transaction := primitives.NewTransaction()
+	transaction := primitives.NewTransaction(context)
 	var entry storage.Stat
 	for _, profile := range profiles {
 		path := path.Join("/applications", name, profile, version)
-		if err := makeParentNodes(i.store, transaction, path); err != nil {
+		if err := makeParentNodes(context, i.store, transaction, path); err != nil {
 			return err
 		}
 		object := i.store.Bind(path)
 		if !entry.ID.IsValid() {
-			if entry, err = object.Put(transaction, envelope); err != nil {
+			if entry, err = object.Put(context, transaction, envelope); err != nil {
 				return errOperationFailed
 			}
 		} else {
-			if _, err := object.Put(transaction, entry.ID); err != nil {
+			if _, err := object.Put(context, transaction, entry.ID); err != nil {
 				return errOperationFailed
 			}
 		}
 	}
-	if err := transaction.Commit(); err != nil {
+	if err := transaction.Commit(context); err != nil {
 		return errOperationFailed
 	}
 	return nil
 }
 
-func (i *invoker) Remove(context ipc.Context, profile string) error {
+func (i *invoker) Remove(context ipc.ServerContext, profile string) error {
 	vlog.VI(0).Infof("%v.Remove(%v)", i.suffix, profile)
 	name, version, err := parse(i.suffix)
 	if err != nil {
 		return err
 	}
-	transaction := primitives.NewTransaction()
+	transaction := primitives.NewTransaction(context)
 	path := path.Join("/applications", name, profile)
 	if version != "" {
 		path += "/" + version
 	}
 	object := i.store.Bind(path)
-	found, err := object.Exists(transaction)
+	found, err := object.Exists(context, transaction)
 	if err != nil {
 		return errOperationFailed
 	}
 	if !found {
 		return errNotFound
 	}
-	if err := object.Remove(transaction); err != nil {
+	if err := object.Remove(context, transaction); err != nil {
 		return errOperationFailed
 	}
-	if err := transaction.Commit(); err != nil {
+	if err := transaction.Commit(context); err != nil {
 		return errOperationFailed
 	}
 	return nil
diff --git a/services/mgmt/content/impl/impl_test.go b/services/mgmt/content/impl/impl_test.go
index 45f3465..37792e1 100644
--- a/services/mgmt/content/impl/impl_test.go
+++ b/services/mgmt/content/impl/impl_test.go
@@ -25,7 +25,7 @@
 // invokeUpload invokes the Upload RPC using the given client stub
 // <stub> and streams the given content <content> to it.
 func invokeUpload(t *testing.T, stub content.Content, content []byte) (string, error) {
-	stream, err := stub.Upload()
+	stream, err := stub.Upload(rt.R().NewContext())
 	if err != nil {
 		return "", err
 	}
@@ -47,7 +47,7 @@
 // invokeDownload invokes the Download RPC using the given client stub
 // <stub> and streams content from to it.
 func invokeDownload(t *testing.T, stub content.Content) ([]byte, error) {
-	stream, err := stub.Download()
+	stream, err := stub.Download(rt.R().NewContext())
 	if err != nil {
 		return nil, err
 	}
@@ -62,7 +62,7 @@
 // invokeDelete invokes the Delete RPC using the given client stub
 // <stub>.
 func invokeDelete(t *testing.T, stub content.Content) error {
-	return stub.Delete()
+	return stub.Delete(rt.R().NewContext())
 }
 
 // testInterface tests the content manager interface using the given
diff --git a/services/mgmt/content/impl/invoker.go b/services/mgmt/content/impl/invoker.go
index 4638f7e..f39f644 100644
--- a/services/mgmt/content/impl/invoker.go
+++ b/services/mgmt/content/impl/invoker.go
@@ -88,7 +88,7 @@
 	return dir
 }
 
-func (i *invoker) Delete(context ipc.Context) error {
+func (i *invoker) Delete(context ipc.ServerContext) error {
 	vlog.VI(0).Infof("%v.Delete()", i.suffix)
 	if !isValid(i.suffix) {
 		return errInvalidSuffix
@@ -116,7 +116,7 @@
 	return nil
 }
 
-func (i *invoker) Download(context ipc.Context, stream content.ContentServiceDownloadStream) error {
+func (i *invoker) Download(context ipc.ServerContext, stream content.ContentServiceDownloadStream) error {
 	vlog.VI(0).Infof("%v.Download()", i.suffix)
 	if !isValid(i.suffix) {
 		return errInvalidSuffix
@@ -147,7 +147,7 @@
 	return nil
 }
 
-func (i *invoker) Upload(context ipc.Context, stream content.ContentServiceUploadStream) (string, error) {
+func (i *invoker) Upload(context ipc.ServerContext, stream content.ContentServiceUploadStream) (string, error) {
 	vlog.VI(0).Infof("%v.Upload()", i.suffix)
 	if i.suffix != "" {
 		return "", errInvalidSuffix
diff --git a/services/mgmt/node/impl/impl_test.go b/services/mgmt/node/impl/impl_test.go
index 136b401..ad89b20 100644
--- a/services/mgmt/node/impl/impl_test.go
+++ b/services/mgmt/node/impl/impl_test.go
@@ -33,7 +33,7 @@
 	envelope *application.Envelope
 }
 
-func (i *arInvoker) Match(_ ipc.Context, _ []string) (application.Envelope, error) {
+func (i *arInvoker) Match(_ ipc.ServerContext, _ []string) (application.Envelope, error) {
 	vlog.VI(1).Infof("Match()")
 	return *i.envelope, nil
 }
@@ -42,11 +42,11 @@
 
 type cmInvoker struct{}
 
-func (i *cmInvoker) Delete(_ ipc.Context) error {
+func (i *cmInvoker) Delete(_ ipc.ServerContext) error {
 	return nil
 }
 
-func (i *cmInvoker) Download(_ ipc.Context, stream content.ContentServiceDownloadStream) error {
+func (i *cmInvoker) Download(_ ipc.ServerContext, stream content.ContentServiceDownloadStream) error {
 	vlog.VI(1).Infof("Download()")
 	file, err := os.Open(os.Args[0])
 	if err != nil {
@@ -72,7 +72,7 @@
 	return nil
 }
 
-func (i *cmInvoker) Upload(_ ipc.Context, _ content.ContentServiceUploadStream) (string, error) {
+func (i *cmInvoker) Upload(_ ipc.ServerContext, _ content.ContentServiceUploadStream) (string, error) {
 	return "", nil
 }
 
@@ -99,7 +99,7 @@
 	if err != nil {
 		t.Fatalf("BindNode(%v) failed: %v", address, err)
 	}
-	if err := nmClient.Update(); err != nil {
+	if err := nmClient.Update(rt.R().NewContext()); err != nil {
 		t.Fatalf("%v.Update() failed: %v", address, err)
 	}
 }
@@ -127,7 +127,7 @@
 	return child
 }
 
-func startApplicationRepository(t *testing.T, runtime veyron2.Runtime, cmAddress string, envelope *application.Envelope) (string, func()) {
+func startApplicationRepository(t *testing.T, runtime veyron2.Runtime, cmAddress string, envelope *application.Envelope) (string, naming.Endpoint, func()) {
 	server, err := runtime.NewServer()
 	if err != nil {
 		t.Fatalf("NewServer() failed: %v", err)
@@ -141,16 +141,17 @@
 	if err != nil {
 		t.Fatalf("Listen(%v, %v) failed: %v", protocol, hostname, err)
 	}
-	address := naming.JoinAddressName(endpoint.String(), suffix)
-	vlog.VI(1).Infof("Application repository running at endpoint: %s", address)
-	return address, func() {
+	// Method calls must be directed to suffix+"/"+suffix
+	server.Publish(suffix)
+	vlog.VI(1).Infof("Application repository running at endpoint: %s", endpoint)
+	return suffix + "/" + suffix, endpoint, func() {
 		if err := server.Stop(); err != nil {
 			t.Fatalf("Stop() failed: %v", err)
 		}
 	}
 }
 
-func startContentManager(t *testing.T, runtime veyron2.Runtime) (string, func()) {
+func startContentManager(t *testing.T, runtime veyron2.Runtime) (string, naming.Endpoint, func()) {
 	server, err := runtime.NewServer()
 	if err != nil {
 		t.Fatalf("NewServer() failed: %v", err)
@@ -164,9 +165,10 @@
 	if err != nil {
 		t.Fatalf("Listen(%v, %v) failed: %v", protocol, hostname, err)
 	}
-	address := naming.JoinAddressName(endpoint.String(), suffix)
-	vlog.VI(1).Infof("Content manager running at endpoint: %s", address)
-	return address, func() {
+	// Method calls must be directed to suffix+"/"+suffix
+	server.Publish(suffix)
+	vlog.VI(1).Infof("Content manager running at endpoint: %s", endpoint)
+	return suffix + "/" + suffix, endpoint, func() {
 		if err := server.Stop(); err != nil {
 			t.Fatalf("Stop() failed: %v", err)
 		}
@@ -174,7 +176,7 @@
 }
 
 func startMountTable(t *testing.T, runtime veyron2.Runtime) (string, func()) {
-	server, err := runtime.NewServer()
+	server, err := runtime.NewServer(veyron2.ServesMountTableOpt(true))
 	if err != nil {
 		t.Fatalf("NewServer() failed: %v", err)
 	}
@@ -191,9 +193,9 @@
 	if err != nil {
 		t.Fatalf("Listen(%v, %v) failed: %v", protocol, hostname, err)
 	}
-	address := naming.JoinAddressName(endpoint.String(), suffix)
-	vlog.VI(1).Infof("Mount table running at endpoint: %s", address)
-	return address, func() {
+	name := naming.JoinAddressName(endpoint.String(), suffix)
+	vlog.VI(1).Infof("Mount table running at endpoint: %s, name %q", endpoint, name)
+	return name, func() {
 		if err := server.Stop(); err != nil {
 			t.Fatalf("Stop() failed: %v", err)
 		}
@@ -236,15 +238,30 @@
 	// Set up a mount table, a content manager, and an application repository.
 	runtime := rt.Init()
 	defer runtime.Shutdown()
-	mtAddress, mtCleanup := startMountTable(t, runtime)
+	mtName, mtCleanup := startMountTable(t, runtime)
 	defer mtCleanup()
 	mt := runtime.MountTable()
-	cmAddress, cmCleanup := startContentManager(t, runtime)
+	// The local, client side MountTable is now relative the MountTable server
+	// started above.
+	mt.SetRoots([]string{mtName})
+
+	cmSuffix, cmEndpoint, cmCleanup := startContentManager(t, runtime)
+	cmName := naming.Join(mtName, cmSuffix)
 	defer cmCleanup()
 	envelope := application.Envelope{}
-	arAddress, arCleanup := startApplicationRepository(t, runtime, cmAddress, &envelope)
+	arSuffix, arEndpoint, arCleanup := startApplicationRepository(t, runtime, cmSuffix, &envelope)
+	//arName := naming.Join(mtName, arSuffix)
 	defer arCleanup()
 
+	if s, err := mt.Resolve(arSuffix); err != nil || s[0] != "/"+arEndpoint.String()+"//ar" {
+		t.Errorf("failed to resolve %q", arSuffix)
+		t.Errorf("err: %v, got %v, want /%v//ar", err, s[0], arEndpoint)
+	}
+	if s, err := mt.Resolve(cmSuffix); err != nil || s[0] != "/"+cmEndpoint.String()+"//cm" {
+		t.Errorf("failed to resolve %q", cmSuffix)
+		t.Errorf("err: %v, got %v, want /%v//cm", err, s[0], cmEndpoint)
+	}
+
 	// Spawn a node manager with an identity blessed by the mounttable's identity.
 	// under the name "test", and obtain its endpoint.
 	// TODO(ataly): Eventually we want to use the same identity the node manager
@@ -252,14 +269,14 @@
 
 	idFile := testutil.SaveIdentityToFile(testutil.NewBlessedIdentity(runtime.Identity(), "test"))
 	defer os.Remove(idFile)
-	child := spawnNodeManager(t, arAddress, mtAddress, idFile)
+	child := spawnNodeManager(t, arSuffix, mtName, idFile)
 	defer child.Cleanup()
 	_ = getProcessID(t, child) // sync with the child
 	envelope.Args = child.Cmd.Args[1:]
 	envelope.Env = child.Cmd.Env
-	envelope.Binary = cmAddress
+	envelope.Binary = cmName
 
-	name := naming.Join(mtAddress, "nm")
+	name := naming.Join(mtName, "nm")
 	results, err := mt.Resolve(name)
 	if err != nil {
 		t.Fatalf("Resolve(%v) failed: %v", name, err)
diff --git a/services/mgmt/node/impl/invoker.go b/services/mgmt/node/impl/invoker.go
index a50c6ba..475307c 100644
--- a/services/mgmt/node/impl/invoker.go
+++ b/services/mgmt/node/impl/invoker.go
@@ -235,7 +235,7 @@
 	return result
 }
 
-func (i *invoker) Describe(call ipc.Context) (node.Description, error) {
+func (i *invoker) Describe(call ipc.ServerContext) (node.Description, error) {
 	vlog.VI(0).Infof("%v.Describe()", i.suffix)
 	empty := node.Description{}
 	nodeProfile, err := i.computeNodeProfile()
@@ -250,7 +250,7 @@
 	return result, nil
 }
 
-func (i *invoker) IsRunnable(call ipc.Context, binary build.BinaryDescription) (bool, error) {
+func (i *invoker) IsRunnable(call ipc.ServerContext, binary build.BinaryDescription) (bool, error) {
 	vlog.VI(0).Infof("%v.IsRunnable(%v)", i.suffix, binary)
 	nodeProfile, err := i.computeNodeProfile()
 	if err != nil {
@@ -268,7 +268,7 @@
 	return len(result.Profiles) > 0, nil
 }
 
-func (i *invoker) Reset(call ipc.Context, deadline uint64) error {
+func (i *invoker) Reset(call ipc.ServerContext, deadline uint64) error {
 	vlog.VI(0).Infof("%v.Reset(%v)", i.suffix, deadline)
 	// TODO(jsimsa): Implement.
 	return nil
@@ -282,7 +282,7 @@
 		vlog.Errorf("BindContent(%q) failed: %v", binary, err)
 		return "", errOperationFailed
 	}
-	stream, err := stub.Download()
+	stream, err := stub.Download(rt.R().NewContext())
 	if err != nil {
 		vlog.Errorf("Download() failed: %v", err)
 		return "", errOperationFailed
@@ -333,7 +333,7 @@
 	// TODO(jsimsa): Include logic that computes the set of supported
 	// profiles.
 	profiles := []string{"test"}
-	envelope, err := stub.Match(profiles)
+	envelope, err := stub.Match(rt.R().NewContext(), profiles)
 	if err != nil {
 		vlog.Errorf("Match(%v) failed: %v", profiles, err)
 		return nil, errOperationFailed
@@ -374,25 +374,25 @@
 	return nil
 }
 
-func (i *invoker) Install(call ipc.Context) (string, error) {
+func (i *invoker) Install(call ipc.ServerContext) (string, error) {
 	vlog.VI(0).Infof("%v.Install()", i.suffix)
 	// TODO(jsimsa): Implement.
 	return "", nil
 }
 
-func (i *invoker) Start(call ipc.Context) ([]string, error) {
+func (i *invoker) Start(call ipc.ServerContext) ([]string, error) {
 	vlog.VI(0).Infof("%v.Start()", i.suffix)
 	// TODO(jsimsa): Implement.
 	return make([]string, 0), nil
 }
 
-func (i *invoker) Uninstall(call ipc.Context) error {
+func (i *invoker) Uninstall(call ipc.ServerContext) error {
 	vlog.VI(0).Infof("%v.Uninstall()", i.suffix)
 	// TODO(jsimsa): Implement.
 	return nil
 }
 
-func (i *invoker) Update(call ipc.Context) error {
+func (i *invoker) Update(call ipc.ServerContext) error {
 	vlog.VI(0).Infof("%v.Update()", i.suffix)
 	switch {
 	case i.suffix == "nm":
@@ -428,31 +428,31 @@
 	}
 }
 
-func (i *invoker) Refresh(call ipc.Context) error {
+func (i *invoker) Refresh(call ipc.ServerContext) error {
 	vlog.VI(0).Infof("%v.Refresh()", i.suffix)
 	// TODO(jsimsa): Implement.
 	return nil
 }
 
-func (i *invoker) Restart(call ipc.Context) error {
+func (i *invoker) Restart(call ipc.ServerContext) error {
 	vlog.VI(0).Infof("%v.Restart()", i.suffix)
 	// TODO(jsimsa): Implement.
 	return nil
 }
 
-func (i *invoker) Resume(call ipc.Context) error {
+func (i *invoker) Resume(call ipc.ServerContext) error {
 	vlog.VI(0).Infof("%v.Resume()", i.suffix)
 	// TODO(jsimsa): Implement.
 	return nil
 }
 
-func (i *invoker) Shutdown(call ipc.Context, deadline uint64) error {
+func (i *invoker) Shutdown(call ipc.ServerContext, deadline uint64) error {
 	vlog.VI(0).Infof("%v.Shutdown(%v)", i.suffix, deadline)
 	// TODO(jsimsa): Implement.
 	return nil
 }
 
-func (i *invoker) Suspend(call ipc.Context) error {
+func (i *invoker) Suspend(call ipc.ServerContext) error {
 	vlog.VI(0).Infof("%v.Suspend()", i.suffix)
 	// TODO(jsimsa): Implement.
 	return nil
diff --git a/services/mgmt/node/noded/main.go b/services/mgmt/node/noded/main.go
index 76dce1e..3d878a3 100644
--- a/services/mgmt/node/noded/main.go
+++ b/services/mgmt/node/noded/main.go
@@ -3,7 +3,6 @@
 import (
 	"flag"
 
-	"veyron/lib/exec"
 	"veyron/lib/signals"
 	vflag "veyron/security/flag"
 	"veyron/services/mgmt/node/impl"
@@ -47,21 +46,6 @@
 			vlog.Fatalf("Publish(%v) failed: %v", name, err)
 		}
 	}
-	// This should really move into the runtime so that every process
-	// benefits from it, in particular we should use it to securely
-	// pick security credentials from the parent.
-	handle, err := exec.NewChildHandle()
-	switch err {
-	case nil:
-		// Node manager was started by self-update, notify the parent
-		// process that you are ready.
-		handle.SetReady()
-	case exec.ErrNoVersion:
-		// Node manager was not started by self-update, no action is
-		// needed.
-	default:
-		vlog.Fatalf("NewChildHandle() failed: %v", err)
-	}
 	// Wait until shutdown.
 	<-signals.ShutdownOnSignals()
 }
diff --git a/services/mgmt/profile/impl/impl_test.go b/services/mgmt/profile/impl/impl_test.go
index 2d27e81..9a92045 100644
--- a/services/mgmt/profile/impl/impl_test.go
+++ b/services/mgmt/profile/impl/impl_test.go
@@ -26,6 +26,8 @@
 	runtime := rt.Init()
 	defer runtime.Shutdown()
 
+	ctx := runtime.NewContext()
+
 	// Setup and start the profile manager server.
 	server, err := runtime.NewServer()
 	if err != nil {
@@ -62,12 +64,12 @@
 	}
 
 	// Put
-	if err := stub.Put(spec); err != nil {
+	if err := stub.Put(ctx, spec); err != nil {
 		t.Fatalf("Put() failed: %v", err)
 	}
 
 	// Label
-	label, err := stub.Label()
+	label, err := stub.Label(ctx)
 	if err != nil {
 		t.Fatalf("Label() failed: %v", err)
 	}
@@ -76,7 +78,7 @@
 	}
 
 	// Description
-	description, err := stub.Description()
+	description, err := stub.Description(ctx)
 	if err != nil {
 		t.Fatalf("Description() failed: %v", err)
 	}
@@ -85,7 +87,7 @@
 	}
 
 	// Specification
-	specification, err := stub.Specification()
+	specification, err := stub.Specification(ctx)
 	if err != nil {
 		t.Fatalf("Specification() failed: %v", err)
 	}
@@ -94,7 +96,7 @@
 	}
 
 	// Remove
-	if err := stub.Remove(); err != nil {
+	if err := stub.Remove(ctx); err != nil {
 		t.Fatalf("Remove() failed: %v", err)
 	}
 
diff --git a/services/mgmt/profile/impl/invoker.go b/services/mgmt/profile/impl/invoker.go
index 0e77181..b3cc3d9 100644
--- a/services/mgmt/profile/impl/invoker.go
+++ b/services/mgmt/profile/impl/invoker.go
@@ -38,13 +38,13 @@
 type dir struct{}
 
 // makeParentNodes creates the parent nodes if they do not already exist.
-func makeParentNodes(store storage.Store, transaction storage.Transaction, path string) error {
+func makeParentNodes(context ipc.ServerContext, store storage.Store, transaction storage.Transaction, path string) error {
 	pathComponents := storage.ParsePath(path)
 	for i := 0; i < len(pathComponents); i++ {
 		name := pathComponents[:i].String()
 		object := store.Bind(name)
-		if _, err := object.Get(transaction); err != nil {
-			if _, err := object.Put(transaction, &dir{}); err != nil {
+		if _, err := object.Get(context, transaction); err != nil {
+			if _, err := object.Put(context, transaction, &dir{}); err != nil {
 				return errOperationFailed
 			}
 		}
@@ -52,39 +52,39 @@
 	return nil
 }
 
-func (i *invoker) Put(context ipc.Context, profile profile.Specification) error {
+func (i *invoker) Put(context ipc.ServerContext, profile profile.Specification) error {
 	vlog.VI(0).Infof("%v.Put(%v)", i.suffix, profile)
-	transaction := primitives.NewTransaction()
+	transaction := primitives.NewTransaction(context)
 	path := path.Join("/profiles", i.suffix)
-	if err := makeParentNodes(i.store, transaction, path); err != nil {
+	if err := makeParentNodes(context, i.store, transaction, path); err != nil {
 		return err
 	}
 	object := i.store.Bind(path)
-	if _, err := object.Put(transaction, profile); err != nil {
+	if _, err := object.Put(context, transaction, profile); err != nil {
 		return errOperationFailed
 	}
-	if err := transaction.Commit(); err != nil {
+	if err := transaction.Commit(context); err != nil {
 		return errOperationFailed
 	}
 	return nil
 }
 
-func (i *invoker) Remove(context ipc.Context) error {
+func (i *invoker) Remove(context ipc.ServerContext) error {
 	vlog.VI(0).Infof("%v.Remove(%v)", i.suffix)
-	transaction := primitives.NewTransaction()
+	transaction := primitives.NewTransaction(context)
 	path := path.Join("/profiles", i.suffix)
 	object := i.store.Bind(path)
-	found, err := object.Exists(transaction)
+	found, err := object.Exists(context, transaction)
 	if err != nil {
 		return errOperationFailed
 	}
 	if !found {
 		return errNotFound
 	}
-	if err := object.Remove(transaction); err != nil {
+	if err := object.Remove(context, transaction); err != nil {
 		return errOperationFailed
 	}
-	if err := transaction.Commit(); err != nil {
+	if err := transaction.Commit(context); err != nil {
 		return errOperationFailed
 	}
 	return nil
@@ -92,11 +92,11 @@
 
 // PROFILE INTERACE IMPLEMENTATION
 
-func (i *invoker) lookup() (profile.Specification, error) {
+func (i *invoker) lookup(context ipc.ServerContext) (profile.Specification, error) {
 	empty := profile.Specification{}
 	path := path.Join("/profiles", i.suffix)
 	object := i.store.Bind(path)
-	entry, err := object.Get(nil)
+	entry, err := object.Get(context, nil)
 	if err != nil {
 		return empty, errNotFound
 	}
@@ -107,25 +107,25 @@
 	return s, nil
 }
 
-func (i *invoker) Label(context ipc.Context) (string, error) {
+func (i *invoker) Label(context ipc.ServerContext) (string, error) {
 	vlog.VI(0).Infof("%v.Label()", i.suffix)
-	s, err := i.lookup()
+	s, err := i.lookup(context)
 	if err != nil {
 		return "", err
 	}
 	return s.Label, nil
 }
 
-func (i *invoker) Description(context ipc.Context) (string, error) {
+func (i *invoker) Description(context ipc.ServerContext) (string, error) {
 	vlog.VI(0).Infof("%v.Description()", i.suffix)
-	s, err := i.lookup()
+	s, err := i.lookup(context)
 	if err != nil {
 		return "", err
 	}
 	return s.Description, nil
 }
 
-func (i *invoker) Specification(context ipc.Context) (profile.Specification, error) {
+func (i *invoker) Specification(context ipc.ServerContext) (profile.Specification, error) {
 	vlog.VI(0).Infof("%v.Specification()", i.suffix)
-	return i.lookup()
+	return i.lookup(context)
 }
diff --git a/services/mgmt/profile/profile.vdl.go b/services/mgmt/profile/profile.vdl.go
index 543e908..f5914a3 100644
--- a/services/mgmt/profile/profile.vdl.go
+++ b/services/mgmt/profile/profile.vdl.go
@@ -67,13 +67,13 @@
 	profile.Profile_ExcludingUniversal
 	// Specification returns the profile specification for the profile
 	// identified through the veyron name suffix.
-	Specification(opts ..._gen_ipc.ClientCallOpt) (reply Specification, err error)
+	Specification(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply Specification, err error)
 	// Put sets the profile specification for the profile identified
 	// through the veyron name suffix.
-	Put(Specification Specification, opts ..._gen_ipc.ClientCallOpt) (err error)
+	Put(ctx _gen_ipc.Context, Specification Specification, opts ..._gen_ipc.CallOpt) (err error)
 	// Remove removes the profile specification for the profile
 	// identified through the veyron name suffix.
-	Remove(opts ..._gen_ipc.ClientCallOpt) (err error)
+	Remove(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (err error)
 }
 type Profile interface {
 	_gen_ipc.UniversalServiceMethods
@@ -90,13 +90,13 @@
 	profile.ProfileService
 	// Specification returns the profile specification for the profile
 	// identified through the veyron name suffix.
-	Specification(context _gen_ipc.Context) (reply Specification, err error)
+	Specification(context _gen_ipc.ServerContext) (reply Specification, err error)
 	// Put sets the profile specification for the profile identified
 	// through the veyron name suffix.
-	Put(context _gen_ipc.Context, Specification Specification) (err error)
+	Put(context _gen_ipc.ServerContext, Specification Specification) (err error)
 	// Remove removes the profile specification for the profile
 	// identified through the veyron name suffix.
-	Remove(context _gen_ipc.Context) (err error)
+	Remove(context _gen_ipc.ServerContext) (err error)
 }
 
 // BindProfile returns the client stub implementing the Profile
@@ -146,9 +146,9 @@
 	name   string
 }
 
-func (__gen_c *clientStubProfile) Specification(opts ..._gen_ipc.ClientCallOpt) (reply Specification, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "Specification", nil, opts...); err != nil {
+func (__gen_c *clientStubProfile) Specification(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply Specification, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "Specification", nil, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -157,9 +157,9 @@
 	return
 }
 
-func (__gen_c *clientStubProfile) Put(Specification Specification, opts ..._gen_ipc.ClientCallOpt) (err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "Put", []interface{}{Specification}, opts...); err != nil {
+func (__gen_c *clientStubProfile) Put(ctx _gen_ipc.Context, Specification Specification, opts ..._gen_ipc.CallOpt) (err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "Put", []interface{}{Specification}, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&err); ierr != nil {
@@ -168,9 +168,9 @@
 	return
 }
 
-func (__gen_c *clientStubProfile) Remove(opts ..._gen_ipc.ClientCallOpt) (err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "Remove", nil, opts...); err != nil {
+func (__gen_c *clientStubProfile) Remove(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "Remove", nil, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&err); ierr != nil {
@@ -179,9 +179,9 @@
 	return
 }
 
-func (__gen_c *clientStubProfile) UnresolveStep(opts ..._gen_ipc.ClientCallOpt) (reply []string, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "UnresolveStep", nil, opts...); err != nil {
+func (__gen_c *clientStubProfile) UnresolveStep(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply []string, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "UnresolveStep", nil, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -190,9 +190,9 @@
 	return
 }
 
-func (__gen_c *clientStubProfile) Signature(opts ..._gen_ipc.ClientCallOpt) (reply _gen_ipc.ServiceSignature, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "Signature", nil, opts...); err != nil {
+func (__gen_c *clientStubProfile) Signature(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply _gen_ipc.ServiceSignature, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "Signature", nil, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -201,9 +201,9 @@
 	return
 }
 
-func (__gen_c *clientStubProfile) GetMethodTags(method string, opts ..._gen_ipc.ClientCallOpt) (reply []interface{}, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "GetMethodTags", []interface{}{method}, opts...); err != nil {
+func (__gen_c *clientStubProfile) GetMethodTags(ctx _gen_ipc.Context, method string, opts ..._gen_ipc.CallOpt) (reply []interface{}, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "GetMethodTags", []interface{}{method}, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
diff --git a/services/mgmt/root/impl/root.go b/services/mgmt/root/impl/root.go
index bfd6e71..7c6cb62 100644
--- a/services/mgmt/root/impl/root.go
+++ b/services/mgmt/root/impl/root.go
@@ -28,7 +28,7 @@
 	cmd.Run()
 }
 
-func (i *invoker) Reset(call ipc.Context, deadline uint64) error {
+func (i *invoker) Reset(call ipc.ServerContext, deadline uint64) error {
 	vlog.VI(0).Infof("Reset(%v).", deadline)
 	switch runtime.GOOS {
 	case "linux":
diff --git a/services/mgmt/root/root.vdl.go b/services/mgmt/root/root.vdl.go
index 99c9c2a..6fb23f5 100644
--- a/services/mgmt/root/root.vdl.go
+++ b/services/mgmt/root/root.vdl.go
@@ -23,7 +23,7 @@
 type Root_ExcludingUniversal interface {
 	// Reset waits for the given deadline (in milliseconds) and then
 	// restars the host node machine.
-	Reset(Deadline uint64, opts ..._gen_ipc.ClientCallOpt) (err error)
+	Reset(ctx _gen_ipc.Context, Deadline uint64, opts ..._gen_ipc.CallOpt) (err error)
 }
 type Root interface {
 	_gen_ipc.UniversalServiceMethods
@@ -35,7 +35,7 @@
 
 	// Reset waits for the given deadline (in milliseconds) and then
 	// restars the host node machine.
-	Reset(context _gen_ipc.Context, Deadline uint64) (err error)
+	Reset(context _gen_ipc.ServerContext, Deadline uint64) (err error)
 }
 
 // BindRoot returns the client stub implementing the Root
@@ -81,9 +81,9 @@
 	name   string
 }
 
-func (__gen_c *clientStubRoot) Reset(Deadline uint64, opts ..._gen_ipc.ClientCallOpt) (err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "Reset", []interface{}{Deadline}, opts...); err != nil {
+func (__gen_c *clientStubRoot) Reset(ctx _gen_ipc.Context, Deadline uint64, opts ..._gen_ipc.CallOpt) (err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "Reset", []interface{}{Deadline}, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&err); ierr != nil {
@@ -92,9 +92,9 @@
 	return
 }
 
-func (__gen_c *clientStubRoot) UnresolveStep(opts ..._gen_ipc.ClientCallOpt) (reply []string, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "UnresolveStep", nil, opts...); err != nil {
+func (__gen_c *clientStubRoot) UnresolveStep(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply []string, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "UnresolveStep", nil, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -103,9 +103,9 @@
 	return
 }
 
-func (__gen_c *clientStubRoot) Signature(opts ..._gen_ipc.ClientCallOpt) (reply _gen_ipc.ServiceSignature, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "Signature", nil, opts...); err != nil {
+func (__gen_c *clientStubRoot) Signature(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply _gen_ipc.ServiceSignature, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "Signature", nil, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -114,9 +114,9 @@
 	return
 }
 
-func (__gen_c *clientStubRoot) GetMethodTags(method string, opts ..._gen_ipc.ClientCallOpt) (reply []interface{}, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "GetMethodTags", []interface{}{method}, opts...); err != nil {
+func (__gen_c *clientStubRoot) GetMethodTags(ctx _gen_ipc.Context, method string, opts ..._gen_ipc.CallOpt) (reply []interface{}, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "GetMethodTags", []interface{}{method}, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
diff --git a/services/mounttable/lib/collection_test.vdl.go b/services/mounttable/lib/collection_test.vdl.go
index a3d516c..cd99693 100644
--- a/services/mounttable/lib/collection_test.vdl.go
+++ b/services/mounttable/lib/collection_test.vdl.go
@@ -21,10 +21,10 @@
 	// an entry exists, if Overwrite is true, then the binding is replaced,
 	// otherwise the call fails with an error.  The Val must be no larger than
 	// MaxSize bytes.
-	Export(Val string, Overwrite bool, opts ..._gen_ipc.ClientCallOpt) (err error)
+	Export(ctx _gen_ipc.Context, Val string, Overwrite bool, opts ..._gen_ipc.CallOpt) (err error)
 	// Lookup retrieves the value associated with a name.  Returns an error if
 	// there is no such binding.
-	Lookup(opts ..._gen_ipc.ClientCallOpt) (reply []byte, err error)
+	Lookup(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply []byte, err error)
 }
 type Collection interface {
 	_gen_ipc.UniversalServiceMethods
@@ -38,10 +38,10 @@
 	// an entry exists, if Overwrite is true, then the binding is replaced,
 	// otherwise the call fails with an error.  The Val must be no larger than
 	// MaxSize bytes.
-	Export(context _gen_ipc.Context, Val string, Overwrite bool) (err error)
+	Export(context _gen_ipc.ServerContext, Val string, Overwrite bool) (err error)
 	// Lookup retrieves the value associated with a name.  Returns an error if
 	// there is no such binding.
-	Lookup(context _gen_ipc.Context) (reply []byte, err error)
+	Lookup(context _gen_ipc.ServerContext) (reply []byte, err error)
 }
 
 // BindCollection returns the client stub implementing the Collection
@@ -87,9 +87,9 @@
 	name   string
 }
 
-func (__gen_c *clientStubCollection) Export(Val string, Overwrite bool, opts ..._gen_ipc.ClientCallOpt) (err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "Export", []interface{}{Val, Overwrite}, opts...); err != nil {
+func (__gen_c *clientStubCollection) Export(ctx _gen_ipc.Context, Val string, Overwrite bool, opts ..._gen_ipc.CallOpt) (err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "Export", []interface{}{Val, Overwrite}, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&err); ierr != nil {
@@ -98,9 +98,9 @@
 	return
 }
 
-func (__gen_c *clientStubCollection) Lookup(opts ..._gen_ipc.ClientCallOpt) (reply []byte, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "Lookup", nil, opts...); err != nil {
+func (__gen_c *clientStubCollection) Lookup(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply []byte, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "Lookup", nil, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -109,9 +109,9 @@
 	return
 }
 
-func (__gen_c *clientStubCollection) UnresolveStep(opts ..._gen_ipc.ClientCallOpt) (reply []string, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "UnresolveStep", nil, opts...); err != nil {
+func (__gen_c *clientStubCollection) UnresolveStep(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply []string, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "UnresolveStep", nil, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -120,9 +120,9 @@
 	return
 }
 
-func (__gen_c *clientStubCollection) Signature(opts ..._gen_ipc.ClientCallOpt) (reply _gen_ipc.ServiceSignature, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "Signature", nil, opts...); err != nil {
+func (__gen_c *clientStubCollection) Signature(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply _gen_ipc.ServiceSignature, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "Signature", nil, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -131,9 +131,9 @@
 	return
 }
 
-func (__gen_c *clientStubCollection) GetMethodTags(method string, opts ..._gen_ipc.ClientCallOpt) (reply []interface{}, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "GetMethodTags", []interface{}{method}, opts...); err != nil {
+func (__gen_c *clientStubCollection) GetMethodTags(ctx _gen_ipc.Context, method string, opts ..._gen_ipc.CallOpt) (reply []interface{}, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "GetMethodTags", []interface{}{method}, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
diff --git a/services/mounttable/lib/mounttable.go b/services/mounttable/lib/mounttable.go
index e0528ed..fe0cecf 100644
--- a/services/mounttable/lib/mounttable.go
+++ b/services/mounttable/lib/mounttable.go
@@ -204,7 +204,7 @@
 
 // ResolveStep returns the next server in a resolution, the name remaining below that server,
 // and whether or not that server is another mount table.
-func (ms *mountContext) ResolveStep(context ipc.Context) (servers []mounttable.MountedServer, suffix string, err error) {
+func (ms *mountContext) ResolveStep(context ipc.ServerContext) (servers []mounttable.MountedServer, suffix string, err error) {
 	vlog.VI(2).Infof("ResolveStep %q", ms.name)
 	mt := ms.mt
 	// TODO(caprita): we need to grab a write lock because walk may
@@ -224,7 +224,7 @@
 }
 
 // Mount a server onto the name in the receiver.
-func (ms *mountContext) Mount(context ipc.Context, server string, ttlsecs uint32) error {
+func (ms *mountContext) Mount(context ipc.ServerContext, server string, ttlsecs uint32) error {
 	mt := ms.mt
 	if ttlsecs == 0 {
 		ttlsecs = 10 * 365 * 24 * 60 * 60 // a really long time
@@ -290,7 +290,7 @@
 
 // Unmount removes servers from the name in the receiver. If server is specified, only that
 // server is removed.
-func (ms *mountContext) Unmount(context ipc.Context, server string) error {
+func (ms *mountContext) Unmount(context ipc.ServerContext, server string) error {
 	mt := ms.mt
 	mt.Lock()
 	defer mt.Unlock()
@@ -315,7 +315,7 @@
 	name string
 }
 
-func (mt *mountTable) globStep(n *node, name string, pattern *glob.Glob, context ipc.Context, reply mounttable.GlobableServiceGlobStream) {
+func (mt *mountTable) globStep(n *node, name string, pattern *glob.Glob, context ipc.ServerContext, reply mounttable.GlobableServiceGlobStream) {
 	vlog.VI(2).Infof("globStep(%s, %s)", name, pattern)
 
 	if mt.acls != nil {
@@ -363,7 +363,7 @@
 // Glob finds matches in the namespace.  If we reach a mount point before matching the
 // whole pattern, return that mount point.
 // pattern is a glob pattern as defined by the veyron/lib/glob package.
-func (ms *mountContext) Glob(context ipc.Context, pattern string, reply mounttable.GlobableServiceGlobStream) error {
+func (ms *mountContext) Glob(context ipc.ServerContext, pattern string, reply mounttable.GlobableServiceGlobStream) error {
 	vlog.VI(2).Infof("mt.Glob %v", ms.elems)
 
 	g, err := glob.Parse(pattern)
diff --git a/services/mounttable/lib/mounttable_test.go b/services/mounttable/lib/mounttable_test.go
index a8e7d86..8bd0f82 100644
--- a/services/mounttable/lib/mounttable_test.go
+++ b/services/mounttable/lib/mounttable_test.go
@@ -76,7 +76,7 @@
 	if err != nil {
 		return nil, err
 	}
-	ss, suffix, err := objectPtr.ResolveStep()
+	ss, suffix, err := objectPtr.ResolveStep(rt.R().NewContext())
 	if err != nil {
 		return nil, err
 	}
@@ -101,12 +101,16 @@
 	return nil, errors.New("Glob is not implemented in this MountTable")
 }
 
+func (s stupidMT) SetRoots([]string) error {
+	return nil
+}
+
 func doMount(t *testing.T, name, service string, shouldSucceed bool, id ipc.ClientOpt) {
 	mtpt, err := mounttable.BindMountTable(name, quuxClient(id))
 	if err != nil {
 		boom(t, "Failed to BindMountTable: %s", err)
 	}
-	if err := mtpt.Mount(service, uint32(ttlSecs)); err != nil {
+	if err := mtpt.Mount(rt.R().NewContext(), service, uint32(ttlSecs)); err != nil {
 		if shouldSucceed {
 			boom(t, "Failed to Mount %s onto %s: %s", service, name, err)
 		}
@@ -120,7 +124,7 @@
 	if err != nil {
 		boom(t, "Failed to BindMountTable: %s", err)
 	}
-	if err := mtpt.Unmount(service); err != nil {
+	if err := mtpt.Unmount(rt.R().NewContext(), service); err != nil {
 		if shouldSucceed {
 			boom(t, "Failed to Unmount %s onto %s: %s", service, name, err)
 		}
@@ -134,7 +138,7 @@
 	if err != nil {
 		boom(t, "Failed to BindCollection: %s", err)
 	}
-	if err := objectPtr.Export(contents, true); err != nil {
+	if err := objectPtr.Export(rt.R().NewContext(), contents, true); err != nil {
 		boom(t, "Failed to Export %s to %s: %s", name, contents, err)
 	}
 }
@@ -144,7 +148,7 @@
 	if err != nil {
 		boom(t, "Failed to BindCollection: %s", err)
 	}
-	contents, err := objectPtr.Lookup()
+	contents, err := objectPtr.Lookup(rt.R().NewContext())
 	if err != nil {
 		if shouldSucceed {
 			boom(t, "Failed to Lookup %s: %s", name, err)
@@ -250,7 +254,7 @@
 	if err != nil {
 		boom(t, "Failed to BindMountTable: %s", err)
 	}
-	stream, err := mtpt.Glob(pattern)
+	stream, err := mtpt.Glob(rt.R().NewContext(), pattern)
 	if err != nil {
 		boom(t, "Failed call to %s.Glob(%s): %s", name, pattern, err)
 	}
diff --git a/services/mounttable/lib/neighborhood.go b/services/mounttable/lib/neighborhood.go
index 6356335..4165ac3 100644
--- a/services/mounttable/lib/neighborhood.go
+++ b/services/mounttable/lib/neighborhood.go
@@ -171,7 +171,7 @@
 }
 
 // ResolveStep implements ResolveStep
-func (ns *neighborhoodService) ResolveStep(_ ipc.Context) (servers []mounttable.MountedServer, suffix string, err error) {
+func (ns *neighborhoodService) ResolveStep(_ ipc.ServerContext) (servers []mounttable.MountedServer, suffix string, err error) {
 	nh := ns.nh
 	vlog.VI(2).Infof("ResolveStep %v\n", ns.elems)
 	if len(ns.elems) == 0 {
@@ -188,17 +188,17 @@
 }
 
 // Mount not implemented.
-func (*neighborhoodService) Mount(_ ipc.Context, server string, ttlsecs uint32) error {
+func (*neighborhoodService) Mount(_ ipc.ServerContext, server string, ttlsecs uint32) error {
 	return errors.New("this server does not implement Mount")
 }
 
 // Unmount not implemented.
-func (*neighborhoodService) Unmount(_ ipc.Context, _ string) error {
+func (*neighborhoodService) Unmount(_ ipc.ServerContext, _ string) error {
 	return errors.New("this server does not implement Unmount")
 }
 
 // Glob implements Glob
-func (ns *neighborhoodService) Glob(_ ipc.Context, pattern string, reply mounttable.GlobableServiceGlobStream) error {
+func (ns *neighborhoodService) Glob(_ ipc.ServerContext, pattern string, reply mounttable.GlobableServiceGlobStream) error {
 	g, err := glob.Parse(pattern)
 	if err != nil {
 		return err
diff --git a/services/mounttable/lib/neighborhood_test.go b/services/mounttable/lib/neighborhood_test.go
index 732fe3b..5528fb3 100644
--- a/services/mounttable/lib/neighborhood_test.go
+++ b/services/mounttable/lib/neighborhood_test.go
@@ -78,7 +78,7 @@
 	if err != nil {
 		boom(t, "BindMountTable: %s", err)
 	}
-	servers, suffix, err := objectPtr.ResolveStep()
+	servers, suffix, err := objectPtr.ResolveStep(r.NewContext())
 	if err != nil {
 		boom(t, "resolveStep: %s", err)
 	}
diff --git a/services/mounttable/mounttabled/mounttable.go b/services/mounttable/mounttabled/mounttable.go
index ac44e45..5749146 100644
--- a/services/mounttable/mounttabled/mounttable.go
+++ b/services/mounttable/mounttabled/mounttable.go
@@ -6,6 +6,7 @@
 	"fmt"
 	"os"
 
+	"veyron2"
 	"veyron2/naming"
 	"veyron2/rt"
 	"veyron2/vlog"
@@ -46,7 +47,7 @@
 	r := rt.Init()
 	defer r.Shutdown()
 
-	server, err := r.NewServer()
+	server, err := r.NewServer(veyron2.ServesMountTableOpt(true))
 	if err != nil {
 		vlog.Errorf("r.NewServer failed: %v", err)
 		return
diff --git a/services/store/memstore/blackbox/many_to_many/many_to_many_test.go b/services/store/memstore/blackbox/many_to_many/many_to_many_test.go
index 06d8615..7b62ff4 100644
--- a/services/store/memstore/blackbox/many_to_many/many_to_many_test.go
+++ b/services/store/memstore/blackbox/many_to_many/many_to_many_test.go
@@ -6,6 +6,7 @@
 
 	"veyron/services/store/memstore"
 	"veyron/services/store/memstore/blackbox"
+	"veyron/services/store/service"
 
 	"veyron2/security"
 	"veyron2/storage"
@@ -88,7 +89,7 @@
 	return &Role{Position: pos, Player: playerID, Team: teamID}
 }
 
-func getPerson(t *testing.T, st *memstore.Store, tr storage.Transaction, path string) (storage.ID, *Person) {
+func getPerson(t *testing.T, st *memstore.Store, tr service.Transaction, path string) (storage.ID, *Person) {
 	_, file, line, _ := runtime.Caller(1)
 	e := blackbox.Get(t, st, tr, path)
 	v := e.Value
@@ -99,7 +100,7 @@
 	return e.Stat.ID, p
 }
 
-func getPlayer(t *testing.T, st *memstore.Store, tr storage.Transaction, path string) (storage.ID, *Player) {
+func getPlayer(t *testing.T, st *memstore.Store, tr service.Transaction, path string) (storage.ID, *Player) {
 	_, file, line, _ := runtime.Caller(1)
 	e := blackbox.Get(t, st, tr, path)
 	v := e.Value
@@ -110,7 +111,7 @@
 	return e.Stat.ID, p
 }
 
-func getTeam(t *testing.T, st *memstore.Store, tr storage.Transaction, path string) (storage.ID, *Team) {
+func getTeam(t *testing.T, st *memstore.Store, tr service.Transaction, path string) (storage.ID, *Team) {
 	_, file, line, _ := runtime.Caller(1)
 	e := blackbox.Get(t, st, tr, path)
 	v := e.Value
@@ -121,7 +122,7 @@
 	return e.Stat.ID, p
 }
 
-func getRole(t *testing.T, st *memstore.Store, tr storage.Transaction, path string) (storage.ID, *Role) {
+func getRole(t *testing.T, st *memstore.Store, tr service.Transaction, path string) (storage.ID, *Role) {
 	_, file, line, _ := runtime.Caller(1)
 	e := blackbox.Get(t, st, tr, path)
 	v := e.Value
@@ -220,7 +221,7 @@
 	return &DirectTeam{}
 }
 
-func getDirectPlayer(t *testing.T, st *memstore.Store, tr storage.Transaction, path string) (storage.ID, *DirectPlayer) {
+func getDirectPlayer(t *testing.T, st *memstore.Store, tr service.Transaction, path string) (storage.ID, *DirectPlayer) {
 	_, file, line, _ := runtime.Caller(1)
 	e := blackbox.Get(t, st, tr, path)
 	v := e.Value
@@ -231,7 +232,7 @@
 	return e.Stat.ID, p
 }
 
-func getDirectTeam(t *testing.T, st *memstore.Store, tr storage.Transaction, path string) (storage.ID, *DirectTeam) {
+func getDirectTeam(t *testing.T, st *memstore.Store, tr service.Transaction, path string) (storage.ID, *DirectTeam) {
 	_, file, line, _ := runtime.Caller(1)
 	e := blackbox.Get(t, st, tr, path)
 	v := e.Value
diff --git a/services/store/memstore/blackbox/photoalbum_test.go b/services/store/memstore/blackbox/photoalbum_test.go
index 2b980b0..9890fe3 100644
--- a/services/store/memstore/blackbox/photoalbum_test.go
+++ b/services/store/memstore/blackbox/photoalbum_test.go
@@ -5,6 +5,7 @@
 	"testing"
 
 	"veyron/services/store/memstore"
+	"veyron/services/store/service"
 
 	"veyron2/storage"
 	"veyron2/vom"
@@ -64,7 +65,7 @@
 	return &Photo{Content: content, Comment: comment}
 }
 
-func getPhoto(t *testing.T, st *memstore.Store, tr storage.Transaction, path string) *Photo {
+func getPhoto(t *testing.T, st *memstore.Store, tr service.Transaction, path string) *Photo {
 	_, file, line, _ := runtime.Caller(1)
 	v := Get(t, st, tr, path).Value
 	p, ok := v.(*Photo)
diff --git a/services/store/memstore/blackbox/team_player_test.go b/services/store/memstore/blackbox/team_player_test.go
index d6ac12e..fc9c3d0 100644
--- a/services/store/memstore/blackbox/team_player_test.go
+++ b/services/store/memstore/blackbox/team_player_test.go
@@ -6,6 +6,7 @@
 
 	"veyron/services/store/memstore"
 	"veyron/services/store/memstore/state"
+	"veyron/services/store/service"
 
 	"veyron2/storage"
 	"veyron2/vom"
@@ -40,7 +41,7 @@
 	return &Team{FullName: name}
 }
 
-func getPlayer(t *testing.T, st *memstore.Store, tr storage.Transaction, path string) (storage.ID, *Player) {
+func getPlayer(t *testing.T, st *memstore.Store, tr service.Transaction, path string) (storage.ID, *Player) {
 	_, file, line, _ := runtime.Caller(1)
 	e := Get(t, st, tr, path)
 	p, ok := e.Value.(*Player)
@@ -50,7 +51,7 @@
 	return e.Stat.ID, p
 }
 
-func getTeam(t *testing.T, st *memstore.Store, tr storage.Transaction, path string) (storage.ID, *Team) {
+func getTeam(t *testing.T, st *memstore.Store, tr service.Transaction, path string) (storage.ID, *Team) {
 	_, file, line, _ := runtime.Caller(1)
 	e := Get(t, st, tr, path)
 	p, ok := e.Value.(*Team)
diff --git a/services/store/memstore/blackbox/util.go b/services/store/memstore/blackbox/util.go
index 55d0748..cc2c921 100644
--- a/services/store/memstore/blackbox/util.go
+++ b/services/store/memstore/blackbox/util.go
@@ -24,7 +24,7 @@
 
 var (
 	rootPublicID security.PublicID = security.FakePublicID("root")
-	rootCtx      ipc.Context       = rootContext{}
+	rootCtx      ipc.ServerContext = rootContext{}
 	nullMutation                   = raw.Mutation{}
 )
 
@@ -82,7 +82,7 @@
 	return nil
 }
 
-func Get(t *testing.T, st *memstore.Store, tr storage.Transaction, path string) *storage.Entry {
+func Get(t *testing.T, st *memstore.Store, tr service.Transaction, path string) *storage.Entry {
 	_, file, line, _ := runtime.Caller(1)
 	e, err := st.Bind(path).Get(rootPublicID, tr)
 	if err != nil {
@@ -91,7 +91,7 @@
 	return e
 }
 
-func Put(t *testing.T, st *memstore.Store, tr storage.Transaction, path string, v interface{}) storage.ID {
+func Put(t *testing.T, st *memstore.Store, tr service.Transaction, path string, v interface{}) storage.ID {
 	_, file, line, _ := runtime.Caller(1)
 	stat, err := st.Bind(path).Put(rootPublicID, tr, v)
 	if err != nil {
@@ -107,14 +107,14 @@
 	return storage.ID{}
 }
 
-func Remove(t *testing.T, st *memstore.Store, tr storage.Transaction, path string) {
+func Remove(t *testing.T, st *memstore.Store, tr service.Transaction, path string) {
 	_, file, line, _ := runtime.Caller(1)
 	if err := st.Bind(path).Remove(rootPublicID, tr); err != nil {
 		t.Fatalf("%s(%d): can't remove %s: %s", file, line, path, err)
 	}
 }
 
-func Commit(t *testing.T, tr storage.Transaction) {
+func Commit(t *testing.T, tr service.Transaction) {
 	if err := tr.Commit(); err != nil {
 		t.Fatalf("Transaction aborted: %s", err)
 	}
@@ -223,7 +223,7 @@
 	close(s.done)
 }
 
-func Watch(t *testing.T, w service.Watcher, ctx ipc.Context, req watch.Request) watch.WatcherWatchStream {
+func Watch(t *testing.T, w service.Watcher, ctx ipc.ServerContext, req watch.Request) watch.WatcherWatchStream {
 	c := make(chan watch.ChangeBatch)
 	done := make(chan bool)
 	go func() {
diff --git a/services/store/memstore/object.go b/services/store/memstore/object.go
index f16a0ab..a0ac078 100644
--- a/services/store/memstore/object.go
+++ b/services/store/memstore/object.go
@@ -34,7 +34,7 @@
 }
 
 // Exists returns true iff the object has a value in the current transaction.
-func (o *object) Exists(pid security.PublicID, trans storage.Transaction) (bool, error) {
+func (o *object) Exists(pid security.PublicID, trans service.Transaction) (bool, error) {
 	tr, _, err := o.store.getTransaction(trans)
 	if err != nil {
 		return false, err
@@ -45,7 +45,7 @@
 }
 
 // Get returns the value for an object.
-func (o *object) Get(pid security.PublicID, trans storage.Transaction) (*storage.Entry, error) {
+func (o *object) Get(pid security.PublicID, trans service.Transaction) (*storage.Entry, error) {
 	tr, _, err := o.store.getTransaction(trans)
 	if err != nil {
 		return nil, err
@@ -54,7 +54,7 @@
 }
 
 // Put updates the value for an object.
-func (o *object) Put(pid security.PublicID, trans storage.Transaction, v interface{}) (*storage.Stat, error) {
+func (o *object) Put(pid security.PublicID, trans service.Transaction, v interface{}) (*storage.Stat, error) {
 	tr, commit, err := o.store.getTransaction(trans)
 	if err != nil {
 		return nil, err
@@ -70,7 +70,7 @@
 }
 
 // Remove removes the value for an object.
-func (o *object) Remove(pid security.PublicID, trans storage.Transaction) error {
+func (o *object) Remove(pid security.PublicID, trans service.Transaction) error {
 	tr, commit, err := o.store.getTransaction(trans)
 	if err != nil {
 		return err
@@ -87,17 +87,17 @@
 // SetAttr changes the attributes of the entry, such as permissions and
 // replication groups.  Attributes are associated with the value, not the
 // path.
-func (o *object) SetAttr(pid security.PublicID, tr storage.Transaction, attrs ...storage.Attr) error {
+func (o *object) SetAttr(pid security.PublicID, tr service.Transaction, attrs ...storage.Attr) error {
 	panic("not implemented")
 }
 
 // Stat returns entry info.
-func (o *object) Stat(pid security.PublicID, tr storage.Transaction) (*storage.Stat, error) {
+func (o *object) Stat(pid security.PublicID, tr service.Transaction) (*storage.Stat, error) {
 	panic("not implemented")
 }
 
 // Query returns entries matching the given query.
-func (o *object) Query(pid security.PublicID, trans storage.Transaction, q query.Query) (service.QueryStream, error) {
+func (o *object) Query(pid security.PublicID, trans service.Transaction, q query.Query) (service.QueryStream, error) {
 	tr, _, err := o.store.getTransaction(trans)
 	if err != nil {
 		return nil, err
@@ -107,7 +107,7 @@
 }
 
 // Glob returns the sequence of names that match the given pattern.
-func (o *object) Glob(pid security.PublicID, trans storage.Transaction, pattern string) (service.GlobStream, error) {
+func (o *object) Glob(pid security.PublicID, trans service.Transaction, pattern string) (service.GlobStream, error) {
 	tr, _, err := o.store.getTransaction(trans)
 	if err != nil {
 		return nil, err
diff --git a/services/store/memstore/store.go b/services/store/memstore/store.go
index 324271f..a4397b0 100644
--- a/services/store/memstore/store.go
+++ b/services/store/memstore/store.go
@@ -150,7 +150,7 @@
 // PutMutations atomically commits a stream of Mutations when the stream is
 // closed. Mutations are not committed if the request is cancelled before the
 // stream has been closed.
-func (st *Store) PutMutations(ctx ipc.Context, stream raw.StoreServicePutMutationsStream) error {
+func (st *Store) PutMutations(ctx ipc.ServerContext, stream raw.StoreServicePutMutationsStream) error {
 	tr := st.newNilTransaction()
 	for {
 		mu, err := stream.Recv()
diff --git a/services/store/memstore/transaction.go b/services/store/memstore/transaction.go
index 0ae3595..5328457 100644
--- a/services/store/memstore/transaction.go
+++ b/services/store/memstore/transaction.go
@@ -5,8 +5,7 @@
 	"sync"
 
 	"veyron/services/store/memstore/state"
-
-	"veyron2/storage"
+	"veyron/services/store/service"
 )
 
 // Transaction is the type of transactions.  Each transaction has a snapshot of
@@ -35,12 +34,12 @@
 	return &Transaction{store: st, snapshot: st.State.MutableSnapshot()}
 }
 
-// getTransaction returns the *Transaction value for the storage.Transaction.
+// getTransaction returns the *Transaction value for the service.Transaction.
 // Returns bool commit==true iff the transaction argument is nil, which means
 // that the transaction lifetime is the duration of the operation (so the
 // transaction should be committed immediately after the operation that uses it
 // is performed).
-func (st *Store) getTransaction(tr storage.Transaction) (*Transaction, bool, error) {
+func (st *Store) getTransaction(tr service.Transaction) (*Transaction, bool, error) {
 	if tr == nil {
 		return st.newNilTransaction(), true, nil
 	}
@@ -53,7 +52,7 @@
 }
 
 // GetTransactionSnapshot returns a read-only snapshot from the transaction.
-func (st *Store) GetTransactionSnapshot(tr storage.Transaction) (state.Snapshot, error) {
+func (st *Store) GetTransactionSnapshot(tr service.Transaction) (state.Snapshot, error) {
 	t, _, err := st.getTransaction(tr)
 	if err != nil {
 		return nil, err
diff --git a/services/store/memstore/util_test.go b/services/store/memstore/util_test.go
index 45b492e..261356e 100644
--- a/services/store/memstore/util_test.go
+++ b/services/store/memstore/util_test.go
@@ -8,13 +8,14 @@
 	"time"
 
 	"veyron/services/store/raw"
+	"veyron/services/store/service"
 
 	"veyron2/ipc"
 	"veyron2/security"
 	"veyron2/storage"
 )
 
-// cancellableContext implements ipc.Context.
+// cancellableContext implements ipc.ServerContext.
 type cancellableContext struct {
 	cancelled chan struct{}
 }
@@ -101,7 +102,7 @@
 
 // clientStream implements raw.StorePutMutationsStream
 type clientStream struct {
-	ctx    ipc.Context
+	ctx    ipc.ServerContext
 	closed bool
 	mus    chan<- raw.Mutation
 	err    <-chan error
@@ -156,7 +157,7 @@
 	}
 }
 
-func mkdir(t *testing.T, st *Store, tr storage.Transaction, path string) (storage.ID, interface{}) {
+func mkdir(t *testing.T, st *Store, tr service.Transaction, path string) (storage.ID, interface{}) {
 	_, file, line, _ := runtime.Caller(1)
 	dir := &Dir{}
 	stat, err := st.Bind(path).Put(rootPublicID, tr, dir)
@@ -166,7 +167,7 @@
 	return stat.ID, dir
 }
 
-func get(t *testing.T, st *Store, tr storage.Transaction, path string) interface{} {
+func get(t *testing.T, st *Store, tr service.Transaction, path string) interface{} {
 	_, file, line, _ := runtime.Caller(1)
 	e, err := st.Bind(path).Get(rootPublicID, tr)
 	if err != nil {
@@ -175,7 +176,7 @@
 	return e.Value
 }
 
-func put(t *testing.T, st *Store, tr storage.Transaction, path string, v interface{}) storage.ID {
+func put(t *testing.T, st *Store, tr service.Transaction, path string, v interface{}) storage.ID {
 	_, file, line, _ := runtime.Caller(1)
 	stat, err := st.Bind(path).Put(rootPublicID, tr, v)
 	if err != nil {
@@ -190,35 +191,35 @@
 	return storage.ID{}
 }
 
-func remove(t *testing.T, st *Store, tr storage.Transaction, path string) {
+func remove(t *testing.T, st *Store, tr service.Transaction, path string) {
 	if err := st.Bind(path).Remove(rootPublicID, tr); err != nil {
 		_, file, line, _ := runtime.Caller(1)
 		t.Errorf("%s(%d): can't remove %s: %s", file, line, path, err)
 	}
 }
 
-func commit(t *testing.T, tr storage.Transaction) {
+func commit(t *testing.T, tr service.Transaction) {
 	if err := tr.Commit(); err != nil {
 		_, file, line, _ := runtime.Caller(1)
 		t.Fatalf("%s(%d): Transaction aborted: %s", file, line, err)
 	}
 }
 
-func expectExists(t *testing.T, st *Store, tr storage.Transaction, path string) {
+func expectExists(t *testing.T, st *Store, tr service.Transaction, path string) {
 	_, file, line, _ := runtime.Caller(1)
 	if ok, _ := st.Bind(path).Exists(rootPublicID, tr); !ok {
 		t.Errorf("%s(%d): does not exist: %s", file, line, path)
 	}
 }
 
-func expectNotExists(t *testing.T, st *Store, tr storage.Transaction, path string) {
+func expectNotExists(t *testing.T, st *Store, tr service.Transaction, path string) {
 	if e, err := st.Bind(path).Get(rootPublicID, tr); err == nil {
 		_, file, line, _ := runtime.Caller(1)
 		t.Errorf("%s(%d): should not exist: %s: got %+v", file, line, path, e.Value)
 	}
 }
 
-func expectValue(t *testing.T, st *Store, tr storage.Transaction, path string, v interface{}) {
+func expectValue(t *testing.T, st *Store, tr service.Transaction, path string, v interface{}) {
 	_, file, line, _ := runtime.Caller(1)
 	e, err := st.Bind(path).Get(rootPublicID, tr)
 	if err != nil {
diff --git a/services/store/memstore/watch/test_util.go b/services/store/memstore/watch/test_util.go
index 9a543bc..5f10875 100644
--- a/services/store/memstore/watch/test_util.go
+++ b/services/store/memstore/watch/test_util.go
@@ -21,7 +21,7 @@
 var (
 	rootPublicID security.PublicID = security.FakePublicID("root")
 
-	rootCtx ipc.Context = &rootContext{}
+	rootCtx ipc.ServerContext = &rootContext{}
 )
 
 type rootContext struct{}
@@ -105,7 +105,7 @@
 	return ctx.cancelled
 }
 
-func get(t *testing.T, st *memstore.Store, tr storage.Transaction, path string) interface{} {
+func get(t *testing.T, st *memstore.Store, tr service.Transaction, path string) interface{} {
 	_, file, line, _ := runtime.Caller(1)
 	e, err := st.Bind(path).Get(rootPublicID, tr)
 	if err != nil {
@@ -114,7 +114,7 @@
 	return e.Value
 }
 
-func put(t *testing.T, st *memstore.Store, tr storage.Transaction, path string, v interface{}) storage.ID {
+func put(t *testing.T, st *memstore.Store, tr service.Transaction, path string, v interface{}) storage.ID {
 	_, file, line, _ := runtime.Caller(1)
 	stat, err := st.Bind(path).Put(rootPublicID, tr, v)
 	if err != nil {
@@ -129,14 +129,14 @@
 	return storage.ID{}
 }
 
-func remove(t *testing.T, st *memstore.Store, tr storage.Transaction, path string) {
+func remove(t *testing.T, st *memstore.Store, tr service.Transaction, path string) {
 	if err := st.Bind(path).Remove(rootPublicID, tr); err != nil {
 		_, file, line, _ := runtime.Caller(1)
 		t.Fatalf("%s(%d): can't remove %s: %s", file, line, path, err)
 	}
 }
 
-func commit(t *testing.T, tr storage.Transaction) {
+func commit(t *testing.T, tr service.Transaction) {
 	if err := tr.Commit(); err != nil {
 		_, file, line, _ := runtime.Caller(1)
 		t.Fatalf("%s(%d): Transaction aborted: %s", file, line, err)
@@ -222,7 +222,7 @@
 // doWatch executes a watch request and returns a new watchResult.
 // Change events may be received on the channel "changes".
 // Once "changes" is closed, any error that occurred is stored to "err".
-func doWatch(w service.Watcher, ctx ipc.Context, req watch.Request) *watchResult {
+func doWatch(w service.Watcher, ctx ipc.ServerContext, req watch.Request) *watchResult {
 	wr := &watchResult{changes: make(chan watch.Change)}
 	go func() {
 		defer close(wr.changes)
diff --git a/services/store/memstore/watch/watcher.go b/services/store/memstore/watch/watcher.go
index 0d53857..ed76358 100644
--- a/services/store/memstore/watch/watcher.go
+++ b/services/store/memstore/watch/watcher.go
@@ -43,7 +43,7 @@
 // sending changes to the specified watch stream. If the call is cancelled or
 // otherwise closed early, Watch will terminate and return an error.
 // Watch implements the service.Watcher interface.
-func (w *watcher) Watch(ctx ipc.Context, req watch.Request, stream watch.WatcherServiceWatchStream) error {
+func (w *watcher) Watch(ctx ipc.ServerContext, req watch.Request, stream watch.WatcherServiceWatchStream) error {
 	processor, err := w.findProcessor(ctx.RemoteID(), req)
 	if err != nil {
 		return err
diff --git a/services/store/raw/service.vdl.go b/services/store/raw/service.vdl.go
index 6f22c54..a031a4d 100644
--- a/services/store/raw/service.vdl.go
+++ b/services/store/raw/service.vdl.go
@@ -63,7 +63,7 @@
 	// PutMutations atomically commits a stream of Mutations when the stream is
 	// closed. Mutations are not committed if the request is cancelled before
 	// the stream has been closed.
-	PutMutations(opts ..._gen_ipc.ClientCallOpt) (reply StorePutMutationsStream, err error)
+	PutMutations(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply StorePutMutationsStream, err error)
 }
 type Store interface {
 	_gen_ipc.UniversalServiceMethods
@@ -79,7 +79,7 @@
 	// PutMutations atomically commits a stream of Mutations when the stream is
 	// closed. Mutations are not committed if the request is cancelled before
 	// the stream has been closed.
-	PutMutations(context _gen_ipc.Context, stream StoreServicePutMutationsStream) (err error)
+	PutMutations(context _gen_ipc.ServerContext, stream StoreServicePutMutationsStream) (err error)
 }
 
 // StorePutMutationsStream is the interface for streaming responses of the method
@@ -106,7 +106,7 @@
 
 // Implementation of the StorePutMutationsStream interface that is not exported.
 type implStorePutMutationsStream struct {
-	clientCall _gen_ipc.ClientCall
+	clientCall _gen_ipc.Call
 }
 
 func (c *implStorePutMutationsStream) Send(item Mutation) error {
@@ -194,18 +194,18 @@
 	name   string
 }
 
-func (__gen_c *clientStubStore) PutMutations(opts ..._gen_ipc.ClientCallOpt) (reply StorePutMutationsStream, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "PutMutations", nil, opts...); err != nil {
+func (__gen_c *clientStubStore) PutMutations(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply StorePutMutationsStream, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "PutMutations", nil, opts...); err != nil {
 		return
 	}
 	reply = &implStorePutMutationsStream{clientCall: call}
 	return
 }
 
-func (__gen_c *clientStubStore) UnresolveStep(opts ..._gen_ipc.ClientCallOpt) (reply []string, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "UnresolveStep", nil, opts...); err != nil {
+func (__gen_c *clientStubStore) UnresolveStep(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply []string, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "UnresolveStep", nil, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -214,9 +214,9 @@
 	return
 }
 
-func (__gen_c *clientStubStore) Signature(opts ..._gen_ipc.ClientCallOpt) (reply _gen_ipc.ServiceSignature, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "Signature", nil, opts...); err != nil {
+func (__gen_c *clientStubStore) Signature(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply _gen_ipc.ServiceSignature, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "Signature", nil, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -225,9 +225,9 @@
 	return
 }
 
-func (__gen_c *clientStubStore) GetMethodTags(method string, opts ..._gen_ipc.ClientCallOpt) (reply []interface{}, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "GetMethodTags", []interface{}{method}, opts...); err != nil {
+func (__gen_c *clientStubStore) GetMethodTags(ctx _gen_ipc.Context, method string, opts ..._gen_ipc.CallOpt) (reply []interface{}, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "GetMethodTags", []interface{}{method}, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
diff --git a/services/store/server/object.go b/services/store/server/object.go
index 741954b..377a57f 100644
--- a/services/store/server/object.go
+++ b/services/store/server/object.go
@@ -86,7 +86,7 @@
 }
 
 // Exists returns true iff the Entry has a value.
-func (o *object) Exists(ctx ipc.Context, tid store.TransactionID) (bool, error) {
+func (o *object) Exists(ctx ipc.ServerContext, tid store.TransactionID) (bool, error) {
 	t, ok := o.server.findTransaction(tid)
 	if !ok {
 		return false, errTransactionDoesNotExist
@@ -97,7 +97,7 @@
 // Get returns the value for the Object.  The value returned is from the
 // most recent mutation of the entry in the Transaction, or from the
 // Transaction's snapshot if there is no mutation.
-func (o *object) Get(ctx ipc.Context, tid store.TransactionID) (store.Entry, error) {
+func (o *object) Get(ctx ipc.ServerContext, tid store.TransactionID) (store.Entry, error) {
 	t, ok := o.server.findTransaction(tid)
 	if !ok {
 		return nullEntry, errTransactionDoesNotExist
@@ -110,7 +110,7 @@
 }
 
 // Put modifies the value of the Object.
-func (o *object) Put(ctx ipc.Context, tid store.TransactionID, val vdl.Any) (store.Stat, error) {
+func (o *object) Put(ctx ipc.ServerContext, tid store.TransactionID, val vdl.Any) (store.Stat, error) {
 	t, ok := o.server.findTransaction(tid)
 	if !ok {
 		return nullStat, errTransactionDoesNotExist
@@ -123,7 +123,7 @@
 }
 
 // Remove removes the Object.
-func (o *object) Remove(ctx ipc.Context, tid store.TransactionID) error {
+func (o *object) Remove(ctx ipc.ServerContext, tid store.TransactionID) error {
 	t, ok := o.server.findTransaction(tid)
 	if !ok {
 		return errTransactionDoesNotExist
@@ -134,7 +134,7 @@
 // SetAttr changes the attributes of the entry, such as permissions and
 // replication groups.  Attributes are associated with the value, not the
 // path.
-func (o *object) SetAttr(ctx ipc.Context, tid store.TransactionID, attrs []vdl.Any) error {
+func (o *object) SetAttr(ctx ipc.ServerContext, tid store.TransactionID, attrs []vdl.Any) error {
 	t, ok := o.server.findTransaction(tid)
 	if !ok {
 		return errTransactionDoesNotExist
@@ -147,7 +147,7 @@
 }
 
 // Stat returns entry info.
-func (o *object) Stat(ctx ipc.Context, tid store.TransactionID) (store.Stat, error) {
+func (o *object) Stat(ctx ipc.ServerContext, tid store.TransactionID) (store.Stat, error) {
 	t, ok := o.server.findTransaction(tid)
 	if !ok {
 		return nullStat, errTransactionDoesNotExist
@@ -160,7 +160,7 @@
 }
 
 // Query returns a sequence of objects that match the given query.
-func (o *object) Query(ctx ipc.Context, tid store.TransactionID, q query.Query, stream store.ObjectServiceQueryStream) error {
+func (o *object) Query(ctx ipc.ServerContext, tid store.TransactionID, q query.Query, stream store.ObjectServiceQueryStream) error {
 	t, ok := o.server.findTransaction(tid)
 	if !ok {
 		return errTransactionDoesNotExist
@@ -189,12 +189,12 @@
 }
 
 // Glob streams a series of names that match the given pattern.
-func (o *object) Glob(ctx ipc.Context, pattern string, stream mounttable.GlobableServiceGlobStream) error {
+func (o *object) Glob(ctx ipc.ServerContext, pattern string, stream mounttable.GlobableServiceGlobStream) error {
 	return o.GlobT(ctx, nullTransactionID, pattern, &globStreamAdapter{stream})
 }
 
 // Glob streams a series of names that match the given pattern.
-func (o *object) GlobT(ctx ipc.Context, tid store.TransactionID, pattern string, stream store.ObjectServiceGlobTStream) error {
+func (o *object) GlobT(ctx ipc.ServerContext, tid store.TransactionID, pattern string, stream store.ObjectServiceGlobTStream) error {
 	t, ok := o.server.findTransaction(tid)
 	if !ok {
 		return errTransactionDoesNotExist
@@ -215,6 +215,6 @@
 }
 
 // Watch returns a stream of changes.
-func (o *object) Watch(ctx ipc.Context, req watch.Request, stream watch.WatcherServiceWatchStream) error {
+func (o *object) Watch(ctx ipc.ServerContext, req watch.Request, stream watch.WatcherServiceWatchStream) error {
 	panic("not implemented")
 }
diff --git a/services/store/server/server.go b/services/store/server/server.go
index 3a02f25..504d560 100644
--- a/services/store/server/server.go
+++ b/services/store/server/server.go
@@ -15,7 +15,6 @@
 	"veyron2/security"
 	"veyron2/services/store"
 	"veyron2/services/watch"
-	"veyron2/storage"
 	"veyron2/vdl"
 )
 
@@ -59,7 +58,7 @@
 }
 
 type transaction struct {
-	trans   storage.Transaction
+	trans   service.Transaction
 	expires time.Time
 }
 
@@ -112,13 +111,13 @@
 }
 
 // findTransaction returns the transaction for the TransactionID.
-func (s *Server) findTransaction(id store.TransactionID) (storage.Transaction, bool) {
+func (s *Server) findTransaction(id store.TransactionID) (service.Transaction, bool) {
 	s.mutex.RLock()
 	defer s.mutex.RUnlock()
 	return s.findTransactionLocked(id)
 }
 
-func (s *Server) findTransactionLocked(id store.TransactionID) (storage.Transaction, bool) {
+func (s *Server) findTransactionLocked(id store.TransactionID) (service.Transaction, bool) {
 	if id == nullTransactionID {
 		return nil, true
 	}
@@ -152,7 +151,7 @@
 }
 
 // CreateTransaction creates a transaction.
-func (s *Server) CreateTransaction(_ ipc.Context, id store.TransactionID, opts []vdl.Any) error {
+func (s *Server) CreateTransaction(_ ipc.ServerContext, id store.TransactionID, opts []vdl.Any) error {
 	s.mutex.Lock()
 	defer s.mutex.Unlock()
 
@@ -171,7 +170,7 @@
 // Commit commits the changes in the transaction to the store.  The
 // operation is atomic, so all mutations are performed, or none.  Returns an
 // error if the transaction aborted.
-func (s *Server) Commit(_ ipc.Context, id store.TransactionID) error {
+func (s *Server) Commit(_ ipc.ServerContext, id store.TransactionID) error {
 	s.mutex.Lock()
 	defer s.mutex.Unlock()
 
@@ -185,7 +184,7 @@
 }
 
 // Abort discards a transaction.
-func (s *Server) Abort(_ ipc.Context, id store.TransactionID) error {
+func (s *Server) Abort(_ ipc.ServerContext, id store.TransactionID) error {
 	s.mutex.Lock()
 	defer s.mutex.Unlock()
 
@@ -199,20 +198,20 @@
 }
 
 // Watch returns a stream of changes.
-func (s *Server) Watch(ctx ipc.Context, req watch.Request, stream watch.WatcherServiceWatchStream) error {
+func (s *Server) Watch(ctx ipc.ServerContext, req watch.Request, stream watch.WatcherServiceWatchStream) error {
 	return s.watcher.Watch(ctx, req, stream)
 }
 
 // PutMutations atomically commits a stream of Mutations when the stream is
 // closed. Mutations are not committed if the request is cancelled before the
 // stream has been closed.
-func (s *Server) PutMutations(ctx ipc.Context, stream raw.StoreServicePutMutationsStream) error {
+func (s *Server) PutMutations(ctx ipc.ServerContext, stream raw.StoreServicePutMutationsStream) error {
 	return s.store.PutMutations(ctx, stream)
 }
 
 // ReadConflicts returns the stream of conflicts to store values.  A
 // conflict occurs when there is a concurrent modification to a value.
-func (s *Server) ReadConflicts(_ ipc.Context, stream store.StoreServiceReadConflictsStream) error {
+func (s *Server) ReadConflicts(_ ipc.ServerContext, stream store.StoreServiceReadConflictsStream) error {
 	panic("not implemented")
 }
 
diff --git a/services/store/server/server_test.go b/services/store/server/server_test.go
index 921dcdc..5e56f73 100644
--- a/services/store/server/server_test.go
+++ b/services/store/server/server_test.go
@@ -25,7 +25,7 @@
 
 	nextTransactionID store.TransactionID = 1
 
-	rootCtx ipc.Context = &rootContext{}
+	rootCtx ipc.ServerContext = &rootContext{}
 )
 
 type rootContext struct{}
@@ -137,7 +137,7 @@
 // doWatch executes a watch request and returns a new watchResult.
 // Change events may be received on the channel "changes".
 // Once "changes" is closed, any error that occurred is stored to "err".
-func doWatch(s *Server, ctx ipc.Context, req watch.Request) *watchResult {
+func doWatch(s *Server, ctx ipc.ServerContext, req watch.Request) *watchResult {
 	wr := &watchResult{changes: make(chan watch.Change)}
 	go func() {
 		defer close(wr.changes)
diff --git a/services/store/service/service.go b/services/store/service/service.go
index a37a37b..fa23b05 100644
--- a/services/store/service/service.go
+++ b/services/store/service/service.go
@@ -11,39 +11,57 @@
 	"veyron2/storage"
 )
 
+// Transaction is like storage.Transaction, but doesn't include extra client-side
+// parameters.
+type Transaction interface {
+	// Commit commits the changes (the Set and Delete operations) in the
+	// transaction to the store.  The operation is atomic, so all Set/Delete
+	// operations are performed, or none.  Returns an error if the transaction
+	// aborted.
+	//
+	// The Transaction should be discarded once Commit is called.  It can no
+	// longer be used.
+	Commit() error
+
+	// Abort discards a transaction.  This is an optimization; transactions
+	// eventually time out and get discarded.  However, live transactions
+	// consume resources, so it is good practice to clean up.
+	Abort() error
+}
+
 // Object is like storage.Object, but it include extra server-side parameters.
 // In perticular, each method takes the identity of the client.
 type Object interface {
 	// Exists returns true iff the Entry has a value.
-	Exists(clientID security.PublicID, t storage.Transaction) (bool, error)
+	Exists(clientID security.PublicID, t Transaction) (bool, error)
 
 	// Get returns the value for the Object.  The value returned is from the
-	// most recent mutation of the entry in the storage.Transaction, or from the
-	// storage.Transaction's snapshot if there is no mutation.
-	Get(clientID security.PublicID, t storage.Transaction) (*storage.Entry, error)
+	// most recent mutation of the entry in the Transaction, or from the
+	// Transaction's snapshot if there is no mutation.
+	Get(clientID security.PublicID, t Transaction) (*storage.Entry, error)
 
 	// Put adds or modifies the Object.  If there is no current value, the
 	// object is created with default attributes.  It is legal to update a
 	// subfield of a value.  Returns the updated *Stat of the store value.  If
 	// putting a subfield, the *Stat is for the enclosing store value.
-	Put(clientID security.PublicID, t storage.Transaction, v interface{}) (*storage.Stat, error)
+	Put(clientID security.PublicID, t Transaction, v interface{}) (*storage.Stat, error)
 
 	// Remove removes the Object.
-	Remove(clientID security.PublicID, t storage.Transaction) error
+	Remove(clientID security.PublicID, t Transaction) error
 
 	// SetAttr changes the attributes of the entry, such as permissions and
 	// replication groups.  Attributes are associated with the value, not the
 	// path.
-	SetAttr(clientID security.PublicID, t storage.Transaction, attrs ...storage.Attr) error
+	SetAttr(clientID security.PublicID, t Transaction, attrs ...storage.Attr) error
 
 	// Stat returns entry info.
-	Stat(clientID security.PublicID, t storage.Transaction) (*storage.Stat, error)
+	Stat(clientID security.PublicID, t Transaction) (*storage.Stat, error)
 
 	// Query returns entries matching the given query.
-	Query(clientID security.PublicID, t storage.Transaction, q query.Query) (QueryStream, error)
+	Query(clientID security.PublicID, t Transaction, q query.Query) (QueryStream, error)
 
 	// Glob returns the sequence of names that match the given pattern.
-	Glob(clientID security.PublicID, t storage.Transaction, pattern string) (GlobStream, error)
+	Glob(clientID security.PublicID, t Transaction, pattern string) (GlobStream, error)
 }
 
 // Store is the server-side interface to the storage system. It is expected to
@@ -56,7 +74,7 @@
 	// PutMutations atomically commits a stream of Mutations when the stream is
 	// closed. Mutations are not committed if the request is cancelled before
 	// the stream has been closed.
-	PutMutations(ctx ipc.Context, stream raw.StoreServicePutMutationsStream) error
+	PutMutations(ctx ipc.ServerContext, stream raw.StoreServicePutMutationsStream) error
 
 	// SetConflictResolver specifies a function to perform conflict resolution.
 	// The <ty> represents the IDL name for the type.
@@ -113,7 +131,7 @@
 // Watcher is the interface for watching store updates that match a query.
 type Watcher interface {
 	// Watch returns a stream of changes that match a query.
-	Watch(ctx ipc.Context, req watch.Request, stream watch.WatcherServiceWatchStream) error
+	Watch(ctx ipc.ServerContext, req watch.Request, stream watch.WatcherServiceWatchStream) error
 
 	// Close closes the Watcher, blocking until all Watch invocations complete.
 	Close() error
diff --git a/services/wspr/wsprd/lib/server.go b/services/wspr/wsprd/lib/server.go
new file mode 100644
index 0000000..035f635
--- /dev/null
+++ b/services/wspr/wsprd/lib/server.go
@@ -0,0 +1,226 @@
+// An implementation of a server for WSPR
+
+package lib
+
+import (
+	"bytes"
+	"encoding/json"
+	"fmt"
+	"sync"
+	"veyron2"
+	"veyron2/ipc"
+	"veyron2/security"
+	"veyron2/verror"
+	"veyron2/vlog"
+	"veyron2/vom"
+)
+
+type flow struct {
+	id     int64
+	writer clientWriter
+}
+
+type serverHelper interface {
+	createNewFlow(server *server, sender sender) *flow
+
+	cleanupFlow(id int64)
+
+	getLogger() vlog.Logger
+
+	rt() veyron2.Runtime
+}
+
+type server struct {
+	sync.Mutex
+	server                    ipc.Server
+	endpoint                  string
+	id                        uint64
+	helper                    serverHelper
+	veyronProxy               string
+	outstandingServerRequests map[int64]chan *serverRPCReply
+}
+
+func newServer(id uint64, veyronProxy string, helper serverHelper) (*server, error) {
+	server := &server{
+		id:                        id,
+		helper:                    helper,
+		veyronProxy:               veyronProxy,
+		outstandingServerRequests: make(map[int64]chan *serverRPCReply),
+	}
+
+	manager, err := helper.rt().NewStreamManager()
+
+	if err != nil {
+		return nil, err
+	}
+
+	server.server, err = helper.rt().NewServer(veyron2.StreamManager(manager))
+
+	if err != nil {
+		return nil, err
+	}
+	return server, nil
+}
+
+// remoteInvokeFunc is a type of function that can invoke a remote method and
+// communicate the result back via a channel to the caller
+type remoteInvokeFunc func(methodName string, args []interface{}, call ipc.ServerCall) <-chan *serverRPCReply
+
+func proxyStream(stream ipc.Stream, w clientWriter) {
+	var item interface{}
+	for err := stream.Recv(&item); err == nil; err = stream.Recv(&item) {
+		data := response{Type: responseStream, Message: item}
+		if err := vom.ObjToJSON(w, vom.ValueOf(data)); err != nil {
+			w.sendError(verror.Internalf("error marshalling stream: %v:", err))
+			return
+		}
+		if err := w.FinishMessage(); err != nil {
+			w.getLogger().VI(2).Info("WSPR: error finishing message", err)
+			return
+		}
+	}
+
+	if err := vom.ObjToJSON(w, vom.ValueOf(response{Type: responseStreamClose})); err != nil {
+		w.sendError(verror.Internalf("error closing stream: %v:", err))
+		return
+	}
+	if err := w.FinishMessage(); err != nil {
+		w.getLogger().VI(2).Info("WSPR: error finishing message", err)
+		return
+	}
+}
+
+func (s *server) createRemoteInvokerFunc(serviceName string) remoteInvokeFunc {
+	return func(methodName string, args []interface{}, call ipc.ServerCall) <-chan *serverRPCReply {
+		flow := s.helper.createNewFlow(s, senderWrapper{stream: call})
+		replyChan := make(chan *serverRPCReply, 1)
+		s.Lock()
+		s.outstandingServerRequests[flow.id] = replyChan
+		s.Unlock()
+		context := serverRPCRequestContext{
+			Suffix: call.Suffix(),
+			Name:   call.Name(),
+		}
+		// Send a invocation request to JavaScript
+		message := serverRPCRequest{
+			ServerId:    s.id,
+			ServiceName: serviceName,
+			Method:      lowercaseFirstCharacter(methodName),
+			Args:        args,
+			Context:     context,
+		}
+
+		data := response{Type: responseServerRequest, Message: message}
+		if err := vom.ObjToJSON(flow.writer, vom.ValueOf(data)); err != nil {
+			// Error in marshaling, pass the error through the channel immediately
+			replyChan <- &serverRPCReply{nil,
+				&verror.Standard{
+					ID:  verror.Internal,
+					Msg: fmt.Sprintf("could not marshal the method call data: %v", err)},
+			}
+			return replyChan
+		}
+		if err := flow.writer.FinishMessage(); err != nil {
+			replyChan <- &serverRPCReply{nil,
+				&verror.Standard{
+					ID:  verror.Internal,
+					Msg: fmt.Sprintf("WSPR: error finishing message: %v", err)},
+			}
+			return replyChan
+		}
+
+		s.helper.getLogger().VI(3).Infof("request received to call method %q on "+
+			"JavaScript server %q with args %v, MessageId %d was assigned.",
+			methodName, serviceName, args, flow.id)
+
+		go proxyStream(call, flow.writer)
+		return replyChan
+	}
+}
+
+func (s *server) register(name string, sig JSONServiceSignature) error {
+	serviceSig, err := sig.ServiceSignature()
+	if err != nil {
+		return err
+	}
+
+	remoteInvokeFunc := s.createRemoteInvokerFunc(name)
+	invoker, err := newInvoker(serviceSig, remoteInvokeFunc)
+
+	if err != nil {
+		return err
+	}
+	dispatcher := newDispatcher(invoker, security.NewACLAuthorizer(
+		security.ACL{security.AllPrincipals: security.AllLabels},
+	))
+
+	if err := s.server.Register(name, dispatcher); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (s *server) publish(name string) (string, error) {
+	if s.endpoint == "" {
+		endpoint, err := s.server.Listen("veyron", s.veyronProxy)
+
+		if err != nil {
+			return "", err
+		}
+		s.endpoint = endpoint.String()
+	}
+	if err := s.server.Publish(name); err != nil {
+		return "", err
+	}
+	s.helper.getLogger().VI(0).Infof("endpoint is %s", s.endpoint)
+	return s.endpoint, nil
+}
+
+func (s *server) handleServerResponse(id int64, data string) {
+	s.Lock()
+	ch := s.outstandingServerRequests[id]
+	delete(s.outstandingServerRequests, id)
+	s.Unlock()
+	if ch == nil {
+		s.helper.getLogger().VI(0).Infof("unexpected result from JavaScript. No channel "+
+			"for MessageId: %d exists. Ignoring the results.", id)
+		//Ignore unknown responses that don't belong to any channel
+		return
+	}
+	// Decode the result and send it through the channel
+	var serverReply serverRPCReply
+	decoder := json.NewDecoder(bytes.NewBufferString(data))
+	if decoderErr := decoder.Decode(&serverReply); decoderErr != nil {
+		err := verror.Standard{
+			ID:  verror.Internal,
+			Msg: fmt.Sprintf("could not unmarshal the result from the server: %v", decoderErr),
+		}
+		serverReply = serverRPCReply{nil, &err}
+	}
+
+	s.helper.getLogger().VI(3).Infof("response received from JavaScript server for "+
+		"MessageId %d with result %v", id, serverReply)
+	s.helper.cleanupFlow(id)
+	ch <- &serverReply
+}
+
+func (s *server) Stop() {
+	result := serverRPCReply{
+		Results: []interface{}{nil},
+		Err: &verror.Standard{
+			ID:  verror.Aborted,
+			Msg: "timeout",
+		},
+	}
+	s.Lock()
+	defer s.Unlock()
+	for _, ch := range s.outstandingServerRequests {
+		select {
+		case ch <- &result:
+		default:
+		}
+	}
+	s.outstandingServerRequests = make(map[int64]chan *serverRPCReply)
+	s.server.Stop()
+}
diff --git a/services/wspr/wsprd/lib/signature_manager.go b/services/wspr/wsprd/lib/signature_manager.go
index 934cd4c..034e743 100644
--- a/services/wspr/wsprd/lib/signature_manager.go
+++ b/services/wspr/wsprd/lib/signature_manager.go
@@ -40,7 +40,7 @@
 
 // signature uses the given client to fetch the signature for the given service name.
 // It locks until it fetches the service signature from the remote server, if not a cache hit.
-func (sm *signatureManager) signature(name string, client ipc.Client) (*ipc.ServiceSignature, error) {
+func (sm *signatureManager) signature(ctx ipc.Context, name string, client ipc.Client) (*ipc.ServiceSignature, error) {
 	sm.Lock()
 	defer sm.Unlock()
 
@@ -50,7 +50,7 @@
 	}
 
 	// cache expired or not found, fetch it from the remote server
-	signatureCall, err := client.StartCall(name, signatureMethodName, []interface{}{})
+	signatureCall, err := client.StartCall(ctx, name, signatureMethodName, []interface{}{})
 	if err != nil {
 		return nil, err
 	}
diff --git a/services/wspr/wsprd/lib/signature_manager_test.go b/services/wspr/wsprd/lib/signature_manager_test.go
index db9a5a4..0271fbd 100644
--- a/services/wspr/wsprd/lib/signature_manager_test.go
+++ b/services/wspr/wsprd/lib/signature_manager_test.go
@@ -6,6 +6,7 @@
 
 	mocks_ipc "veyron/runtimes/google/testing/mocks/ipc"
 	"veyron2/ipc"
+	"veyron2/rt"
 	"veyron2/vdl"
 	"veyron2/wiretype"
 )
@@ -75,7 +76,7 @@
 
 func TestFetching(t *testing.T) {
 	sm := newSignatureManager()
-	got, err := sm.signature(name, client())
+	got, err := sm.signature(rt.R().NewContext(), name, client())
 	if err != nil {
 		t.Errorf(`Did not expect an error but got %v`, err)
 		return
@@ -86,7 +87,7 @@
 
 func TestThatCachedAfterFetching(t *testing.T) {
 	sm := newSignatureManager()
-	sig, _ := sm.signature(name, client())
+	sig, _ := sm.signature(rt.R().NewContext(), name, client())
 	cache, ok := sm.cache[name]
 	if !ok {
 		t.Errorf(`Signature manager did not cache the results`)
@@ -100,8 +101,8 @@
 	sm := newSignatureManager()
 
 	// call twice
-	sm.signature(name, client)
-	sm.signature(name, client)
+	sm.signature(rt.R().NewContext(), name, client)
+	sm.signature(rt.R().NewContext(), name, client)
 
 	// expect number of calls to Signature method of client to still be 1 since cache
 	// should have been used despite the second call
@@ -113,14 +114,14 @@
 func TestThatLastAccessedGetUpdated(t *testing.T) {
 	client := client()
 	sm := newSignatureManager()
-	sm.signature(name, client)
+	sm.signature(rt.R().NewContext(), name, client)
 	// make last accessed be in the past to account for the fact that
 	// two consecutive calls to time.Now() can return identical values.
 	sm.cache[name].lastAccessed = sm.cache[name].lastAccessed.Add(-ttl / 2)
 	prevAccess := sm.cache[name].lastAccessed
 
 	// access again
-	sm.signature(name, client)
+	sm.signature(rt.R().NewContext(), name, client)
 	newAccess := sm.cache[name].lastAccessed
 
 	if !newAccess.After(prevAccess) {
@@ -131,13 +132,13 @@
 func TestThatTTLExpires(t *testing.T) {
 	client := client()
 	sm := newSignatureManager()
-	sm.signature(name, client)
+	sm.signature(rt.R().NewContext(), name, client)
 
 	// make last accessed go over the ttl
 	sm.cache[name].lastAccessed = sm.cache[name].lastAccessed.Add(-2 * ttl)
 
 	// make a second call
-	sm.signature(name, client)
+	sm.signature(rt.R().NewContext(), name, client)
 
 	// expect number of calls to Signature method of client to be 2 since cache should have expired
 	if client.TimesCalled(signatureMethodName) != 2 {
diff --git a/services/wspr/wsprd/lib/stream.go b/services/wspr/wsprd/lib/stream.go
index f31ca6e..062115b 100644
--- a/services/wspr/wsprd/lib/stream.go
+++ b/services/wspr/wsprd/lib/stream.go
@@ -62,7 +62,7 @@
 	}
 
 	// If the stream is on the client side, then also close the stream.
-	if call, ok := stream.(ipc.ClientCall); ok {
+	if call, ok := stream.(ipc.Call); ok {
 		call.CloseSend()
 	}
 }
diff --git a/services/wspr/wsprd/lib/writer.go b/services/wspr/wsprd/lib/writer.go
new file mode 100644
index 0000000..c8717b3
--- /dev/null
+++ b/services/wspr/wsprd/lib/writer.go
@@ -0,0 +1,87 @@
+package lib
+
+import (
+	"bytes"
+	"fmt"
+	"path/filepath"
+	"runtime"
+	"veyron2/verror"
+	"veyron2/vlog"
+	"veyron2/vom"
+
+	"github.com/gorilla/websocket"
+)
+
+// This is basically an io.Writer interface, that allows passing error message
+// strings.  This is how the proxy will talk to the javascript/java clients.
+type clientWriter interface {
+	Write(p []byte) (int, error)
+
+	getLogger() vlog.Logger
+
+	sendError(err error)
+
+	FinishMessage() error
+}
+
+// Implements clientWriter interface for sending messages over websockets.
+type websocketWriter struct {
+	ws     *websocket.Conn
+	buf    bytes.Buffer
+	logger vlog.Logger // TODO(bprosnitz) Remove this -- it has nothing to do with websockets!
+	id     int64
+}
+
+func (w *websocketWriter) getLogger() vlog.Logger {
+	return w.logger
+}
+
+func (w *websocketWriter) Write(p []byte) (int, error) {
+	w.buf.Write(p)
+	return len(p), nil
+}
+
+func (w *websocketWriter) sendError(err error) {
+	verr := verror.ToStandard(err)
+
+	// Also log the error but write internal errors at a more severe log level
+	var logLevel vlog.Level = 2
+	logErr := fmt.Sprintf("%v", verr)
+	// We want to look at the stack three frames up to find where the error actually
+	// occurred.  (caller -> websocketErrorResponse/sendError -> generateErrorMessage).
+	if _, file, line, ok := runtime.Caller(3); ok {
+		logErr = fmt.Sprintf("%s:%d: %s", filepath.Base(file), line, logErr)
+	}
+	if verror.Is(verr, verror.Internal) {
+		logLevel = 2
+	}
+	w.logger.VI(logLevel).Info(logErr)
+
+	var errMsg = verror.Standard{
+		ID:  verr.ErrorID(),
+		Msg: verr.Error(),
+	}
+
+	w.buf.Reset()
+	if err := vom.ObjToJSON(&w.buf, vom.ValueOf(response{Type: responseError, Message: errMsg})); err != nil {
+		w.logger.VI(2).Info("Failed to marshal with", err)
+		return
+	}
+	if err := w.FinishMessage(); err != nil {
+		w.logger.VI(2).Info("WSPR: error finishing message: ", err)
+		return
+	}
+}
+
+func (w *websocketWriter) FinishMessage() error {
+	wc, err := w.ws.NextWriter(websocket.TextMessage)
+	if err != nil {
+		return err
+	}
+	if err := vom.ObjToJSON(wc, vom.ValueOf(websocketMessage{Id: w.id, Data: w.buf.String()})); err != nil {
+		return err
+	}
+	wc.Close()
+	w.buf.Reset()
+	return nil
+}
diff --git a/services/wspr/wsprd/lib/wspr.go b/services/wspr/wsprd/lib/wspr.go
index 8c7b297..f720f51 100644
--- a/services/wspr/wsprd/lib/wspr.go
+++ b/services/wspr/wsprd/lib/wspr.go
@@ -27,15 +27,12 @@
 	"net/http"
 	_ "net/http/pprof"
 	"os"
-	"path/filepath"
-	"runtime"
 	"strings"
 	"sync"
 	"time"
 
 	"veyron2"
 	"veyron2/ipc"
-	"veyron2/naming"
 	"veyron2/rt"
 	"veyron2/security"
 	"veyron2/verror"
@@ -66,11 +63,11 @@
 type responseType int
 
 const (
-	responseFinal       responseType = 0
-	responseStream                   = 1
-	responseError                    = 2
-	serverRequest                    = 3
-	responseStreamClose              = 4
+	responseFinal         responseType = 0
+	responseStream                     = 1
+	responseError                      = 2
+	responseServerRequest              = 3
+	responseStreamClose                = 4
 )
 
 // Wraps a response to the proxy client and adds a message type.
@@ -157,104 +154,8 @@
 	Err     *verror.Standard
 }
 
-// This is basically an io.Writer interface, that allows passing error message
-// strings.  This is how the proxy will talk to the javascript/java clients.
-type clientWriter interface {
-	Write(p []byte) (int, error)
-
-	getLogger() vlog.Logger
-
-	sendError(err error)
-
-	FinishMessage() error
-}
-
-type vomMessage struct {
-	Format string // 'binary' or 'json'
-	Data   string // base64 encoded bytes if binary, or the VOM JSON string
-}
-
-type vomToJSONRequest struct {
-	Message vomMessage
-}
-
-type vomToJSONResponse struct {
-	Message string
-}
-
-type jsonToVOMRequest struct {
-	RequestedFormat string // 'binary' or 'json'
-	Message         string
-}
-
-type jsonToVOMResponse struct {
-	Message vomMessage
-}
-
-// Implements clientWriter interface for sending messages over websockets.
-type websocketWriter struct {
-	ws     *websocket.Conn
-	buf    bytes.Buffer
-	logger vlog.Logger // TODO(bprosnitz) Remove this -- it has nothing to do with websockets!
-	id     int64
-}
-
-func (w *websocketWriter) getLogger() vlog.Logger {
-	return w.logger
-}
-
-func (w *websocketWriter) Write(p []byte) (int, error) {
-	w.buf.Write(p)
-	return len(p), nil
-}
-
-func (w *websocketWriter) sendError(err error) {
-	verr := verror.ToStandard(err)
-
-	// Also log the error but write internal errors at a more severe log level
-	var logLevel vlog.Level = 2
-	logErr := fmt.Sprintf("%v", verr)
-	// We want to look at the stack three frames up to find where the error actually
-	// occurred.  (caller -> websocketErrorResponse/sendError -> generateErrorMessage).
-	if _, file, line, ok := runtime.Caller(3); ok {
-		logErr = fmt.Sprintf("%s:%d: %s", filepath.Base(file), line, logErr)
-	}
-	if verror.Is(verr, verror.Internal) {
-		logLevel = 2
-	}
-	w.logger.VI(logLevel).Info(logErr)
-
-	var errMsg = verror.Standard{
-		ID:  verr.ErrorID(),
-		Msg: verr.Error(),
-	}
-
-	w.buf.Reset()
-	if err := vom.ObjToJSON(&w.buf, vom.ValueOf(response{Type: responseError, Message: errMsg})); err != nil {
-		w.logger.VI(2).Info("Failed to marshal with", err)
-		return
-	}
-	if err := w.FinishMessage(); err != nil {
-		w.logger.VI(2).Info("WSPR: error finishing message: ", err)
-		return
-	}
-}
-
-func (w *websocketWriter) FinishMessage() error {
-	wc, err := w.ws.NextWriter(websocket.TextMessage)
-	if err != nil {
-		return err
-	}
-	if err := vom.ObjToJSON(wc, vom.ValueOf(websocketMessage{Id: w.id, Data: w.buf.String()})); err != nil {
-		return err
-	}
-	wc.Close()
-	w.buf.Reset()
-	return nil
-}
-
 // finishCall waits for the call to finish and write out the response to w.
-func finishCall(w clientWriter, clientCall ipc.ClientCall, msg *veyronRPC) {
+func finishCall(w clientWriter, clientCall ipc.Call, msg *veyronRPC) {
 	if msg.IsStreaming {
 		for {
 			var item interface{}
@@ -345,13 +246,13 @@
 	return client, nil
 }
 
-func (ctx WSPR) startVeyronRequest(w clientWriter, msg *veyronRPC) (ipc.ClientCall, error) {
+func (ctx WSPR) startVeyronRequest(w clientWriter, msg *veyronRPC) (ipc.Call, error) {
 	// Issue request to the endpoint.
 	client, err := ctx.newClient(msg.PrivateId)
 	if err != nil {
 		return nil, err
 	}
-	clientCall, err := client.StartCall(msg.Name, uppercaseFirstCharacter(msg.Method), msg.InArgs)
+	clientCall, err := client.StartCall(ctx.rt.TODOContext(), msg.Name, uppercaseFirstCharacter(msg.Method), msg.InArgs)
 
 	if err != nil {
 		return nil, fmt.Errorf("error starting call: %v", err)
@@ -439,59 +340,68 @@
 	// Streams for the outstanding requests.
 	outstandingStreams map[int64]sender
 
-	// Channels that are used to communicate the final response of a
-	// server request.
-	outstandingServerRequests map[int64]chan serverRPCReply
+	// Maps flowids to the server that owns them.
+	flowMap map[int64]*server
 
 	// A manager that handles fetching and caching signature of remote services
 	signatureManager *signatureManager
 
-	// We maintain one Veyron server per websocket pipe for publishing JavaScript
+	// We maintain multiple Veyron server per websocket pipe for publishing JavaScript
 	// services.
-	veyronServer ipc.Server
-
-	// Endpoint for the server.
-	endpoint naming.Endpoint
+	servers map[uint64]*server
 
 	// Creates a client writer for a given flow.  This is a member so that tests can override
 	// the default implementation.
 	writerCreator func(id int64) clientWriter
 }
 
+// Implements the serverHelper interface
+func (wsp *websocketPipe) createNewFlow(server *server, stream sender) *flow {
+	wsp.Lock()
+	defer wsp.Unlock()
+	id := wsp.lastGeneratedId
+	wsp.lastGeneratedId += 2
+	wsp.flowMap[id] = server
+	wsp.outstandingStreams[id] = stream
+	return &flow{id: id, writer: wsp.writerCreator(id)}
+}
+
+func (wsp *websocketPipe) cleanupFlow(id int64) {
+	wsp.Lock()
+	defer wsp.Unlock()
+	delete(wsp.outstandingStreams, id)
+	delete(wsp.flowMap, id)
+}
+
+func (wsp *websocketPipe) getLogger() vlog.Logger {
+	return wsp.ctx.logger
+}
+
+func (wsp *websocketPipe) rt() veyron2.Runtime {
+	return wsp.ctx.rt
+}
+
 // cleans up any outstanding rpcs.
 func (wsp *websocketPipe) cleanup() {
 	wsp.Lock()
 	defer wsp.Unlock()
 	for _, stream := range wsp.outstandingStreams {
-		if call, ok := stream.(ipc.ClientCall); ok {
+		if call, ok := stream.(ipc.Call); ok {
 			call.Cancel()
 		}
 	}
 
-	result := serverRPCReply{
-		Results: []interface{}{nil},
-		Err: &verror.Standard{
-			ID:  verror.Aborted,
-			Msg: "timeout",
-		},
+	for _, server := range wsp.servers {
+		server.Stop()
 	}
-
-	for _, reply := range wsp.outstandingServerRequests {
-		reply <- result
-	}
-
-	if wsp.veyronServer != nil {
-		wsp.ctx.logger.VI(0).Infof("Stopping server")
-		wsp.veyronServer.Stop()
-	}
-	wsp.ctx.logger.VI(0).Infof("Stopped server")
 }
 
 func (wsp *websocketPipe) setup() {
 	wsp.ctx.logger.Info("identity is", wsp.ctx.rt.Identity())
 	wsp.signatureManager = newSignatureManager()
-	wsp.outstandingServerRequests = make(map[int64]chan serverRPCReply)
 	wsp.outstandingStreams = make(map[int64]sender)
+	wsp.flowMap = make(map[int64]*server)
+	wsp.servers = make(map[uint64]*server)
 
 	if wsp.writerCreator == nil {
 		wsp.writerCreator = func(id int64) clientWriter {
@@ -700,82 +610,43 @@
 	wsp.cleanup()
 }
 
+func (wsp *websocketPipe) maybeCreateServer(serverId uint64) (*server, error) {
+	wsp.Lock()
+	defer wsp.Unlock()
+	if server, ok := wsp.servers[serverId]; ok {
+		return server, nil
+	}
+	server, err := newServer(serverId, wsp.ctx.veyronProxyEP, wsp)
+	if err != nil {
+		return nil, err
+	}
+	wsp.servers[serverId] = server
+	return server, nil
+}
+
 func (wsp *websocketPipe) publish(publishRequest publishRequest, w clientWriter) {
 	// Create a server for the websocket pipe, if it does not exist already
-	wsp.Lock()
-	shouldListen := false
-	if wsp.veyronServer == nil {
-		// We have to create a StreamManger per veyronServer so that they
-		// have different routing ids if we are listening on the veyron proxy.
-		manager, err := wsp.ctx.rt.NewStreamManager()
-		if err != nil {
-			w.sendError(verror.Internalf("failed creating server: %v", err))
-			wsp.Unlock()
-			return
-		}
-		veyronServer, err := wsp.ctx.rt.NewServer(veyron2.StreamManager(manager))
-		if err != nil {
-			w.sendError(verror.Internalf("failed creating server: %v", err))
-			wsp.Unlock()
-			return
-		}
-		wsp.veyronServer = veyronServer
-		shouldListen = true
+	server, err := wsp.maybeCreateServer(publishRequest.ServerId)
+	if err != nil {
+		w.sendError(verror.Internalf("error creating server: %v", err))
 	}
-	wsp.Unlock()
 
 	wsp.ctx.logger.VI(2).Infof("publishing under name: %q", publishRequest.Name)
 
 	// Register each service under the server
 	for serviceName, jsonIDLSig := range publishRequest.Services {
-		// Create a function that is called from the framework by the invoker, which
-		// itself is called by the IPC framework.
-		// This function returns a channel that will be filled with the result of
-		// the call when results come back from JavaScript.
-		remoteInvokerFunc := wsp.createRemoteInvokerFunc(publishRequest.ServerId, serviceName)
-
-		sig, err := jsonIDLSig.ServiceSignature()
-		if err != nil {
-			w.sendError(verror.Internalf("error creating service signature: %v", err))
-			return
-		}
-
-		// Create an invoker based on the available methods in the IDL and give it
-		// the removeInvokerFunction to call
-		invoker, err := newInvoker(sig, remoteInvokerFunc)
-		if err != nil {
-			w.sendError(verror.Internalf("error registering service: %s: %v", serviceName, err))
-			return
-		}
-
-		//TODO(aghassemi) Security labels need to come from JS service, for now we allow AllLabels
-		authorizer := security.NewACLAuthorizer(
-			security.ACL{security.AllPrincipals: security.AllLabels},
-		)
-
-		dispatcher := newDispatcher(invoker, authorizer)
-		if err := wsp.veyronServer.Register(serviceName, dispatcher); err != nil {
-			w.sendError(verror.Internalf("error registering service: %s: %v", serviceName, err))
-			return
+		if err := server.register(serviceName, jsonIDLSig); err != nil {
+			w.sendError(verror.Internalf("error registering service: %v", err))
 		}
 	}
 
-	if shouldListen {
-		var err error
-		// Create an endpoint and begin listening.
-		wsp.endpoint, err = wsp.veyronServer.Listen("veyron", wsp.ctx.veyronProxyEP)
-		if err != nil {
-			w.sendError(verror.Internalf("error listening to service: %v", err))
-			return
-		}
-	}
-
-	if err := wsp.veyronServer.Publish(publishRequest.Name); err != nil {
+	endpoint, err := server.publish(publishRequest.Name)
+	if err != nil {
 		w.sendError(verror.Internalf("error publishing service: %v", err))
 		return
 	}
 	// Send the endpoint back
-	endpointData := response{Type: responseFinal, Message: wsp.endpoint.String()}
+	endpointData := response{Type: responseFinal, Message: endpoint}
 	if err := vom.ObjToJSON(w, vom.ValueOf(endpointData)); err != nil {
 		w.sendError(verror.Internalf("error marshalling results: %v", err))
 		return
@@ -800,134 +671,19 @@
 	wsp.publish(publishRequest, w)
 }
 
-// remoteInvokeFunc is a type of function that can invoke a remote method and
-// communicate the result back via a channel to the caller
-type remoteInvokeFunc func(methodName string, args []interface{}, call ipc.ServerCall) <-chan serverRPCReply
-
-func (wsp *websocketPipe) proxyStream(stream ipc.Stream, w clientWriter, id int64) {
-	var item interface{}
-	for err := stream.Recv(&item); err == nil; err = stream.Recv(&item) {
-		data := response{Type: responseStream, Message: item}
-		if err := vom.ObjToJSON(w, vom.ValueOf(data)); err != nil {
-			w.sendError(verror.Internalf("error marshalling stream: %v:", err))
-			return
-		}
-		if err := w.FinishMessage(); err != nil {
-			w.getLogger().VI(2).Info("WSPR: error finishing message", err)
-			return
-		}
-	}
-	wsp.Lock()
-	defer wsp.Unlock()
-	if _, ok := wsp.outstandingStreams[id]; !ok {
-		wsp.ctx.logger.VI(2).Infof("Dropping close for flow: %d", id)
-		return
-	}
-
-	if err := vom.ObjToJSON(w, vom.ValueOf(response{Type: responseStreamClose})); err != nil {
-		w.sendError(verror.Internalf("error closing stream: %v:", err))
-		return
-	}
-	if err := w.FinishMessage(); err != nil {
-		w.getLogger().VI(2).Info("WSPR: error finishing message", err)
-		return
-	}
-}
-
-// createRemoteInvokerFunc creates and returns a delegate of type remoteInvokeFunc.
-// This delegate function is called by http proxy invoker which itself is called
-// by the ipc framework on RPC calls. This function is delegated with the task
-// of making a call to JavaScript through websockets and to return a channel that will
-// be filled later by handleServerResponse when results come back from JavaScript.
-func (wsp *websocketPipe) createRemoteInvokerFunc(serverId uint64, serviceName string) remoteInvokeFunc {
-	return func(methodName string, args []interface{}, call ipc.ServerCall) <-chan serverRPCReply {
-		wsp.Lock()
-		// Register a new channel
-		messageId := wsp.lastGeneratedId
-		replyChan := make(chan serverRPCReply, 1)
-		wsp.outstandingServerRequests[messageId] = replyChan
-		wsp.outstandingStreams[messageId] = senderWrapper{stream: call}
-		wsp.lastGeneratedId += 2 // Sever generated IDs are even numbers
-		wsp.Unlock()
-
-		ww := wsp.writerCreator(messageId)
-
-		//TODO(aghassemi) Add security related stuff (Caveats, Label, LocalID, RemoteID) to context as part of security work
-		//TODO(aghassemi) Deadline and Canceled, we need to find a way to do that for JS since
-		//canceled being a async WS message would yield wrong results.
-		context := serverRPCRequestContext{
-			Suffix: call.Suffix(),
-			Name:   call.Name(),
-		}
-		// Send a invocation request to JavaScript
-		message := serverRPCRequest{
-			ServerId:    serverId,
-			ServiceName: serviceName,
-			Method:      lowercaseFirstCharacter(methodName),
-			Args:        args,
-			Context:     context,
-		}
-		data := response{Type: serverRequest, Message: message}
-		if err := vom.ObjToJSON(ww, vom.ValueOf(data)); err != nil {
-			// Error in marshaling, pass the error through the channel immediately
-			replyChan <- serverRPCReply{nil,
-				&verror.Standard{
-					ID:  verror.Internal,
-					Msg: fmt.Sprintf("could not marshal the method call data: %v", err)},
-			}
-			return replyChan
-		}
-		if err := ww.FinishMessage(); err != nil {
-			replyChan <- serverRPCReply{nil,
-				&verror.Standard{
-					ID:  verror.Internal,
-					Msg: fmt.Sprintf("WSPR: error finishing message: %v", err)},
-			}
-			return replyChan
-		}
-
-		wsp.ctx.logger.VI(3).Infof("request received to call method %q on "+
-			"JavaScript server %q with args %v, MessageId %d was assigned.",
-			methodName, serviceName, args, messageId)
-
-		go wsp.proxyStream(call, ww, messageId)
-		return replyChan
-	}
-}
-
 // handleServerResponse handles the completion of outstanding calls to JavaScript services
 // by filling the corresponding channel with the result from JavaScript.
 func (wsp *websocketPipe) handleServerResponse(id int64, data string) {
-	// Find the corresponding Go channel waiting on the result
-	serverResponseChan := wsp.outstandingServerRequests[int64(id)]
-	if serverResponseChan == nil {
+	wsp.Lock()
+	server := wsp.flowMap[id]
+	wsp.Unlock()
+	if server == nil {
 		wsp.ctx.logger.VI(0).Infof("unexpected result from JavaScript. No channel "+
 			"for MessageId: %d exists. Ignoring the results.", id)
 		//Ignore unknown responses that don't belong to any channel
 		return
 	}
-
-	// Decode the result and send it through the channel
-	var serverReply serverRPCReply
-	decoder := json.NewDecoder(bytes.NewBufferString(data))
-	if decoderErr := decoder.Decode(&serverReply); decoderErr != nil {
-		err := verror.Standard{
-			ID:  verror.Internal,
-			Msg: fmt.Sprintf("could not unmarshal the result from the server: %v", decoderErr),
-		}
-		serverReply = serverRPCReply{nil, &err}
-	}
-
-	wsp.ctx.logger.VI(3).Infof("response received from JavaScript server for "+
-		"MessageId %d with result %v", id, serverReply)
-
-	wsp.Lock()
-	defer wsp.Unlock()
-	wsp.ctx.logger.VI(2).Infof("Deleting stream for %v", id)
-	delete(wsp.outstandingStreams, id)
-	delete(wsp.outstandingServerRequests, id)
-	wsp.ctx.logger.VI(2).Infof("Sending back %v", serverReply)
-	serverResponseChan <- serverReply
+	server.handleServerResponse(id, data)
 }
 
 type signatureRequest struct {
@@ -942,7 +698,8 @@
 	}
 
 	// Fetch and adapt signature from the SignatureManager
-	sig, err := wsp.signatureManager.signature(name, client)
+	ctx := wsp.ctx.rt.TODOContext()
+	sig, err := wsp.signatureManager.signature(ctx, name, client)
 	if err != nil {
 		return nil, verror.Internalf("error getting service signature for %s: %v", name, err)
 	}
diff --git a/services/wspr/wsprd/lib/wspr_test.go b/services/wspr/wsprd/lib/wspr_test.go
index 26ffc7b..1ed34a9 100644
--- a/services/wspr/wsprd/lib/wspr_test.go
+++ b/services/wspr/wsprd/lib/wspr_test.go
@@ -92,8 +92,16 @@
 type registerFunc func(ipc.Server) error
 
 func startServer(registerer registerFunc) (ipc.Server, naming.Endpoint, error) {
+	return startAnyServer(false, registerer)
+}
+
+func startMTServer(registerer registerFunc) (ipc.Server, naming.Endpoint, error) {
+	return startAnyServer(true, registerer)
+}
+
+func startAnyServer(servesMT bool, registerer registerFunc) (ipc.Server, naming.Endpoint, error) {
 	// Create a new server instance.
-	s, err := r.NewServer()
+	s, err := r.NewServer(veyron2.ServesMountTableOpt(servesMT))
 	if err != nil {
 		return nil, nil, err
 	}
@@ -126,7 +134,7 @@
 }
 
 func startMountTableServer() (ipc.Server, naming.Endpoint, error) {
-	return startServer(func(server ipc.Server) error {
+	return startMTServer(func(server ipc.Server) error {
 		mt, err := mounttable.NewMountTable("")
 		if err != nil {
 			return err
@@ -231,7 +239,7 @@
 	wspr.setup()
 	wsp := websocketPipe{ctx: wspr}
 	wsp.setup()
-	jsSig, err := wsp.getSignature("/"+endpoint.String()+"/cache", "")
+	jsSig, err := wsp.getSignature("/"+endpoint.String()+"//cache", "")
 	if err != nil {
 		t.Errorf("Failed to get signature: %v", err)
 	}
@@ -280,7 +288,7 @@
 	}
 
 	request := veyronRPC{
-		Name:        "/" + endpoint.String() + "/cache",
+		Name:        "/" + endpoint.String() + "//cache",
 		Method:      test.method,
 		InArgs:      test.inArgs,
 		NumOutArgs:  test.numOutArgs,
@@ -453,7 +461,7 @@
 
 	proxyEndpoint := proxyServer.Endpoint().String()
 
-	wspr := NewWSPR(0, "/"+proxyEndpoint, veyron2.MountTableRoots{"/" + endpoint.String() + "/mt"})
+	wspr := NewWSPR(0, "/"+proxyEndpoint, veyron2.MountTableRoots{"/" + endpoint.String() + "/mt//"})
 	wspr.setup()
 	wsp := websocketPipe{ctx: wspr}
 	writer := testWriter{
@@ -500,14 +508,14 @@
 		t.Errorf("unable to create client: %v", err)
 	}
 
-	call, err := client.StartCall("/"+msg+"/adder", test.method, test.inArgs)
+	call, err := client.StartCall(wspr.rt.NewContext(), "/"+msg+"//adder", test.method, test.inArgs)
 	if err != nil {
 		t.Errorf("failed to start call: %v", err)
 	}
 
 	expectedWebsocketMessage := []response{
 		response{
-			Type: serverRequest,
+			Type: responseServerRequest,
 			Message: map[string]interface{}{
 				"serverId":    0.0,
 				"serviceName": "adder",
@@ -532,16 +540,13 @@
 		}
 	}
 
-	if len(test.clientStream) > 0 {
-		call.CloseSend()
-		expectedWebsocketMessage = append(expectedWebsocketMessage, response{Type: responseStreamClose})
-	}
-
 	// Wait until all the streaming messages have been acknowledged.
 	if err := writer.waitForMessage(len(expectedWebsocketMessage)); err != nil {
 		t.Errorf("didn't recieve expected message: %v", err)
 	}
 
+	expectedWebsocketMessage = append(expectedWebsocketMessage, response{Type: responseStreamClose})
+
 	expectedStream := test.serverStream
 	go sendServerStream(t, &wsp, &test, &writer)
 	for {
diff --git a/tools/application/impl/impl.go b/tools/application/impl/impl.go
index 61c4a92..b6248b0 100644
--- a/tools/application/impl/impl.go
+++ b/tools/application/impl/impl.go
@@ -13,11 +13,12 @@
 	"veyron/lib/cmdline"
 	iapp "veyron/services/mgmt/application"
 
+	"veyron2/rt"
 	"veyron2/services/mgmt/application"
 )
 
 func getEnvelopeJSON(app iapp.Repository, profiles string) ([]byte, error) {
-	env, err := app.Match(strings.Split(profiles, ","))
+	env, err := app.Match(rt.R().NewContext(), strings.Split(profiles, ","))
 	if err != nil {
 		env = application.Envelope{}
 	}
@@ -33,7 +34,7 @@
 	if err := json.Unmarshal(j, &env); err != nil {
 		return fmt.Errorf("json: %v", err)
 	}
-	if err := app.Put(strings.Split(profiles, ","), env); err != nil {
+	if err := app.Put(rt.R().NewContext(), strings.Split(profiles, ","), env); err != nil {
 		return err
 	}
 	return nil
@@ -125,7 +126,7 @@
 	if err != nil {
 		return fmt.Errorf("bind error: %v", err)
 	}
-	if err = app.Remove(args[1]); err != nil {
+	if err = app.Remove(rt.R().NewContext(), args[1]); err != nil {
 		return err
 	}
 	fmt.Fprintln(cmd.Stdout(), "Application envelope removed successfully.")
diff --git a/tools/application/impl/impl_test.go b/tools/application/impl/impl_test.go
index 37df8e2..0029325 100644
--- a/tools/application/impl/impl_test.go
+++ b/tools/application/impl/impl_test.go
@@ -44,17 +44,17 @@
 	suffix string
 }
 
-func (s *server) Match(_ ipc.Context, profiles []string) (application.Envelope, error) {
+func (s *server) Match(_ ipc.ServerContext, profiles []string) (application.Envelope, error) {
 	vlog.VI(2).Infof("%v.Match(%v) was called", s.suffix, profiles)
 	return envelope, nil
 }
 
-func (s *server) Put(_ ipc.Context, profiles []string, env application.Envelope) error {
+func (s *server) Put(_ ipc.ServerContext, profiles []string, env application.Envelope) error {
 	vlog.VI(2).Infof("%v.Put(%v, %v) was called", s.suffix, profiles, env)
 	return nil
 }
 
-func (s *server) Remove(_ ipc.Context, profile string) error {
+func (s *server) Remove(_ ipc.ServerContext, profile string) error {
 	vlog.VI(2).Infof("%v.Remove(%v) was called", s.suffix, profile)
 	return nil
 }
diff --git a/tools/content/impl/impl.go b/tools/content/impl/impl.go
index 0b042b0..ef412d5 100644
--- a/tools/content/impl/impl.go
+++ b/tools/content/impl/impl.go
@@ -7,6 +7,7 @@
 
 	"veyron/lib/cmdline"
 
+	"veyron2/rt"
 	"veyron2/services/mgmt/content"
 )
 
@@ -27,7 +28,7 @@
 	if err != nil {
 		return fmt.Errorf("bind error: %v", err)
 	}
-	if err = c.Delete(); err != nil {
+	if err = c.Delete(rt.R().NewContext()); err != nil {
 		return err
 	}
 	fmt.Fprintf(cmd.Stdout(), "Content deleted successfully\n")
@@ -65,7 +66,7 @@
 		return fmt.Errorf("bind error: %v", err)
 	}
 
-	stream, err := c.Download()
+	stream, err := c.Download(rt.R().NewContext())
 	if err != nil {
 		return err
 	}
@@ -123,7 +124,7 @@
 		return fmt.Errorf("bind error: %v", err)
 	}
 
-	stream, err := c.Upload()
+	stream, err := c.Upload(rt.R().NewContext())
 	if err != nil {
 		return err
 	}
diff --git a/tools/content/impl/impl_test.go b/tools/content/impl/impl_test.go
index e61e550..3bc79a8 100644
--- a/tools/content/impl/impl_test.go
+++ b/tools/content/impl/impl_test.go
@@ -24,7 +24,7 @@
 	suffix string
 }
 
-func (s *server) Delete(ipc.Context) error {
+func (s *server) Delete(ipc.ServerContext) error {
 	vlog.VI(2).Infof("Delete() was called. suffix=%v", s.suffix)
 	if s.suffix != "exists" {
 		return fmt.Errorf("content doesn't exist: %v", s.suffix)
@@ -32,14 +32,14 @@
 	return nil
 }
 
-func (s *server) Download(_ ipc.Context, stream content.ContentServiceDownloadStream) error {
+func (s *server) Download(_ ipc.ServerContext, stream content.ContentServiceDownloadStream) error {
 	vlog.VI(2).Infof("Download() was called. suffix=%v", s.suffix)
 	stream.Send([]byte("Hello"))
 	stream.Send([]byte("World"))
 	return nil
 }
 
-func (s *server) Upload(_ ipc.Context, stream content.ContentServiceUploadStream) (string, error) {
+func (s *server) Upload(_ ipc.ServerContext, stream content.ContentServiceUploadStream) (string, error) {
 	vlog.VI(2).Infof("Upload() was called. suffix=%v", s.suffix)
 	for {
 		if _, err := stream.Recv(); err != nil {
diff --git a/tools/mounttable/impl/impl.go b/tools/mounttable/impl/impl.go
index d9f4886..bc250a8 100644
--- a/tools/mounttable/impl/impl.go
+++ b/tools/mounttable/impl/impl.go
@@ -44,7 +44,7 @@
 	if err != nil {
 		return fmt.Errorf("bind error: %v", err)
 	}
-	stream, err := c.Glob(args[1])
+	stream, err := c.Glob(rt.R().NewContext(), args[1])
 	if err != nil {
 		return err
 	}
@@ -95,7 +95,7 @@
 	if err != nil {
 		return fmt.Errorf("TTL parse error: %v", err)
 	}
-	err = c.Mount(args[1], uint32(ttl.Seconds()))
+	err = c.Mount(rt.R().NewContext(), args[1], uint32(ttl.Seconds()))
 	if err != nil {
 		return err
 	}
@@ -124,7 +124,7 @@
 	if err != nil {
 		return fmt.Errorf("bind error: %v", err)
 	}
-	err = c.Unmount(args[1])
+	err = c.Unmount(rt.R().NewContext(), args[1])
 	if err != nil {
 		return err
 	}
@@ -152,7 +152,7 @@
 	if err != nil {
 		return fmt.Errorf("bind error: %v", err)
 	}
-	servers, suffix, err := c.ResolveStep()
+	servers, suffix, err := c.ResolveStep(rt.R().NewContext())
 	if err != nil {
 		return err
 	}
diff --git a/tools/mounttable/impl/impl_test.go b/tools/mounttable/impl/impl_test.go
index 51a37ce..4af1d5f 100644
--- a/tools/mounttable/impl/impl_test.go
+++ b/tools/mounttable/impl/impl_test.go
@@ -20,24 +20,24 @@
 	suffix string
 }
 
-func (s *server) Glob(_ ipc.Context, pattern string, stream mounttable.GlobableServiceGlobStream) error {
+func (s *server) Glob(_ ipc.ServerContext, pattern string, stream mounttable.GlobableServiceGlobStream) error {
 	vlog.VI(2).Infof("Glob() was called. suffix=%v pattern=%q", s.suffix, pattern)
 	stream.Send(mounttable.MountEntry{"name1", []mounttable.MountedServer{{"server1", 123}}})
 	stream.Send(mounttable.MountEntry{"name2", []mounttable.MountedServer{{"server2", 456}, {"server3", 789}}})
 	return nil
 }
 
-func (s *server) Mount(_ ipc.Context, server string, ttl uint32) error {
+func (s *server) Mount(_ ipc.ServerContext, server string, ttl uint32) error {
 	vlog.VI(2).Infof("Mount() was called. suffix=%v server=%q ttl=%d", s.suffix, server, ttl)
 	return nil
 }
 
-func (s *server) Unmount(_ ipc.Context, server string) error {
+func (s *server) Unmount(_ ipc.ServerContext, server string) error {
 	vlog.VI(2).Infof("Unmount() was called. suffix=%v server=%q", s.suffix, server)
 	return nil
 }
 
-func (s *server) ResolveStep(ipc.Context) (servers []mounttable.MountedServer, suffix string, err error) {
+func (s *server) ResolveStep(ipc.ServerContext) (servers []mounttable.MountedServer, suffix string, err error) {
 	vlog.VI(2).Infof("ResolveStep() was called. suffix=%v", s.suffix)
 	servers = []mounttable.MountedServer{{"server1", 123}}
 	suffix = s.suffix
diff --git a/tools/profile/impl/impl.go b/tools/profile/impl/impl.go
index ccb9038..0d3b745 100644
--- a/tools/profile/impl/impl.go
+++ b/tools/profile/impl/impl.go
@@ -5,6 +5,8 @@
 
 	"veyron/lib/cmdline"
 	"veyron/services/mgmt/profile"
+
+	"veyron2/rt"
 )
 
 var cmdLabel = &cmdline.Command{
@@ -24,7 +26,7 @@
 	if err != nil {
 		return fmt.Errorf("bind error: %v", err)
 	}
-	label, err := p.Label()
+	label, err := p.Label(rt.R().NewContext())
 	if err != nil {
 		return err
 	}
@@ -49,7 +51,7 @@
 	if err != nil {
 		return fmt.Errorf("bind error: %v", err)
 	}
-	desc, err := p.Description()
+	desc, err := p.Description(rt.R().NewContext())
 	if err != nil {
 		return err
 	}
@@ -74,7 +76,7 @@
 	if err != nil {
 		return fmt.Errorf("bind error: %v", err)
 	}
-	spec, err := p.Specification()
+	spec, err := p.Specification(rt.R().NewContext())
 	if err != nil {
 		return err
 	}
@@ -107,7 +109,7 @@
 		Label:       "example",
 		Description: "Example profile to test the profile manager implementation.",
 	}
-	if err := p.Put(spec); err != nil {
+	if err := p.Put(rt.R().NewContext(), spec); err != nil {
 		return err
 	}
 	fmt.Fprintln(cmd.Stdout(), "Specification updated successfully.")
@@ -131,7 +133,7 @@
 	if err != nil {
 		return fmt.Errorf("bind error: %v", err)
 	}
-	if err = p.Remove(); err != nil {
+	if err = p.Remove(rt.R().NewContext()); err != nil {
 		return err
 	}
 	fmt.Fprintln(cmd.Stdout(), "Profile removed successfully.")
diff --git a/tools/profile/impl/impl_test.go b/tools/profile/impl/impl_test.go
index 4de7fa8..9435742 100644
--- a/tools/profile/impl/impl_test.go
+++ b/tools/profile/impl/impl_test.go
@@ -31,7 +31,7 @@
 	suffix string
 }
 
-func (s *server) Label(ipc.Context) (string, error) {
+func (s *server) Label(ipc.ServerContext) (string, error) {
 	vlog.VI(2).Infof("%v.Label() was called", s.suffix)
 	if s.suffix != "exists" {
 		return "", fmt.Errorf("profile doesn't exist: %v", s.suffix)
@@ -39,7 +39,7 @@
 	return spec.Label, nil
 }
 
-func (s *server) Description(ipc.Context) (string, error) {
+func (s *server) Description(ipc.ServerContext) (string, error) {
 	vlog.VI(2).Infof("%v.Description() was called", s.suffix)
 	if s.suffix != "exists" {
 		return "", fmt.Errorf("profile doesn't exist: %v", s.suffix)
@@ -47,7 +47,7 @@
 	return spec.Description, nil
 }
 
-func (s *server) Specification(ipc.Context) (profile.Specification, error) {
+func (s *server) Specification(ipc.ServerContext) (profile.Specification, error) {
 	vlog.VI(2).Infof("%v.Specification() was called", s.suffix)
 	if s.suffix != "exists" {
 		return profile.Specification{}, fmt.Errorf("profile doesn't exist: %v", s.suffix)
@@ -55,12 +55,12 @@
 	return spec, nil
 }
 
-func (s *server) Put(_ ipc.Context, _ profile.Specification) error {
+func (s *server) Put(_ ipc.ServerContext, _ profile.Specification) error {
 	vlog.VI(2).Infof("%v.Put() was called", s.suffix)
 	return nil
 }
 
-func (s *server) Remove(ipc.Context) error {
+func (s *server) Remove(ipc.ServerContext) error {
 	vlog.VI(2).Infof("%v.Remove() was called", s.suffix)
 	if s.suffix != "exists" {
 		return fmt.Errorf("profile doesn't exist: %v", s.suffix)
diff --git a/tools/proximity/impl/impl.go b/tools/proximity/impl/impl.go
index cc2130b..a7e6ed6 100644
--- a/tools/proximity/impl/impl.go
+++ b/tools/proximity/impl/impl.go
@@ -5,6 +5,7 @@
 
 	"veyron/lib/cmdline"
 
+	"veyron2/rt"
 	"veyron2/services/proximity"
 )
 
@@ -28,7 +29,7 @@
 	if err != nil {
 		return fmt.Errorf("bind error: %v", err)
 	}
-	if err = p.RegisterName(args[1]); err != nil {
+	if err = p.RegisterName(rt.R().TODOContext(), args[1]); err != nil {
 		return err
 	}
 	fmt.Fprintf(cmd.Stdout(), "Name registered successfully\n")
@@ -55,7 +56,7 @@
 	if err != nil {
 		return fmt.Errorf("bind error: %v", err)
 	}
-	if err = p.UnregisterName(args[1]); err != nil {
+	if err = p.UnregisterName(rt.R().TODOContext(), args[1]); err != nil {
 		return err
 	}
 	fmt.Fprintf(cmd.Stdout(), "Name unregistered successfully\n")
@@ -81,7 +82,7 @@
 		return fmt.Errorf("bind error: %v", err)
 	}
 
-	devices, err := p.NearbyDevices()
+	devices, err := p.NearbyDevices(rt.R().TODOContext())
 	if err != nil {
 		return err
 	}
diff --git a/tools/proximity/impl/impl_test.go b/tools/proximity/impl/impl_test.go
index afeaded..d22fbb3 100644
--- a/tools/proximity/impl/impl_test.go
+++ b/tools/proximity/impl/impl_test.go
@@ -19,17 +19,17 @@
 type server struct {
 }
 
-func (s *server) RegisterName(_ ipc.Context, name string) error {
+func (s *server) RegisterName(_ ipc.ServerContext, name string) error {
 	vlog.VI(2).Infof("RegisterName(%q) was called", name)
 	return nil
 }
 
-func (s *server) UnregisterName(_ ipc.Context, name string) error {
+func (s *server) UnregisterName(_ ipc.ServerContext, name string) error {
 	vlog.VI(2).Infof("UnregisterName(%q) was called", name)
 	return nil
 }
 
-func (s *server) NearbyDevices(_ ipc.Context) ([]proximity.Device, error) {
+func (s *server) NearbyDevices(_ ipc.ServerContext) ([]proximity.Device, error) {
 	vlog.VI(2).Info("NearbyDevices() was called")
 	devices := []proximity.Device{
 		{MAC: "xx:xx:xx:xx:xx:xx", Names: []string{"name1", "name2"}, Distance: "1m"},
diff --git a/tools/vrpc/impl/impl.go b/tools/vrpc/impl/impl.go
index 2547d20..8ace3da 100644
--- a/tools/vrpc/impl/impl.go
+++ b/tools/vrpc/impl/impl.go
@@ -59,7 +59,8 @@
 	}
 	defer client.Close()
 
-	signature, err := getSignature(cmd, args[0], client)
+	ctx := runtime.NewContext()
+	signature, err := getSignature(ctx, cmd, args[0], client)
 	if err != nil {
 		return err
 	}
@@ -97,7 +98,8 @@
 	}
 	defer client.Close()
 
-	signature, err := getSignature(cmd, server, client)
+	ctx := runtime.NewContext()
+	signature, err := getSignature(ctx, cmd, server, client)
 	if err != nil {
 		return fmt.Errorf("invoke: failed to get signature for %v: %v", server, err)
 	}
@@ -143,7 +145,7 @@
 	}
 
 	// Initiate the method invocation.
-	call, err := client.StartCall(server, method, inputs)
+	call, err := client.StartCall(ctx, server, method, inputs)
 	if err != nil {
 		return fmt.Errorf("client.StartCall(%s, %q, %v) failed with %v", server, method, inputs, err)
 	}
@@ -207,8 +209,8 @@
 	return client, nil
 }
 
-func getSignature(cmd *cmdline.Command, server string, client ipc.Client) (ipc.ServiceSignature, error) {
-	call, err := client.StartCall(server, "Signature", nil)
+func getSignature(ctx ipc.Context, cmd *cmdline.Command, server string, client ipc.Client) (ipc.ServiceSignature, error) {
+	call, err := client.StartCall(ctx, server, "Signature", nil)
 	if err != nil {
 		return ipc.ServiceSignature{}, fmt.Errorf("client.StartCall(%s, Signature, nil) failed with %v", server, err)
 	}
diff --git a/tools/vrpc/impl/impl_test.go b/tools/vrpc/impl/impl_test.go
index fdfda7e..f2dcea8 100644
--- a/tools/vrpc/impl/impl_test.go
+++ b/tools/vrpc/impl/impl_test.go
@@ -21,102 +21,102 @@
 
 // TypeTester interface implementation
 
-func (*server) Bool(call ipc.Context, i1 bool) (bool, error) {
+func (*server) Bool(call ipc.ServerContext, i1 bool) (bool, error) {
 	vlog.VI(2).Info("Bool(%v) was called.", i1)
 	return i1, nil
 }
 
-func (*server) Float32(call ipc.Context, i1 float32) (float32, error) {
+func (*server) Float32(call ipc.ServerContext, i1 float32) (float32, error) {
 	vlog.VI(2).Info("Float32(%u) was called.", i1)
 	return i1, nil
 }
 
-func (*server) Float64(call ipc.Context, i1 float64) (float64, error) {
+func (*server) Float64(call ipc.ServerContext, i1 float64) (float64, error) {
 	vlog.VI(2).Info("Float64(%u) was called.", i1)
 	return i1, nil
 }
 
-func (*server) Int32(call ipc.Context, i1 int32) (int32, error) {
+func (*server) Int32(call ipc.ServerContext, i1 int32) (int32, error) {
 	vlog.VI(2).Info("Int32(%v) was called.", i1)
 	return i1, nil
 }
 
-func (*server) Int64(call ipc.Context, i1 int64) (int64, error) {
+func (*server) Int64(call ipc.ServerContext, i1 int64) (int64, error) {
 	vlog.VI(2).Info("Int64(%v) was called.", i1)
 	return i1, nil
 }
 
-func (*server) String(call ipc.Context, i1 string) (string, error) {
+func (*server) String(call ipc.ServerContext, i1 string) (string, error) {
 	vlog.VI(2).Info("String(%v) was called.", i1)
 	return i1, nil
 }
 
-func (*server) Byte(call ipc.Context, i1 byte) (byte, error) {
+func (*server) Byte(call ipc.ServerContext, i1 byte) (byte, error) {
 	vlog.VI(2).Info("Byte(%v) was called.", i1)
 	return i1, nil
 }
 
-func (*server) UInt32(call ipc.Context, i1 uint32) (uint32, error) {
+func (*server) UInt32(call ipc.ServerContext, i1 uint32) (uint32, error) {
 	vlog.VI(2).Info("UInt32(%u) was called.", i1)
 	return i1, nil
 }
 
-func (*server) UInt64(call ipc.Context, i1 uint64) (uint64, error) {
+func (*server) UInt64(call ipc.ServerContext, i1 uint64) (uint64, error) {
 	vlog.VI(2).Info("UInt64(%u) was called.", i1)
 	return i1, nil
 }
 
-func (*server) InputArray(call ipc.Context, i1 [2]uint8) error {
+func (*server) InputArray(call ipc.ServerContext, i1 [2]uint8) error {
 	vlog.VI(2).Info("CInputArray(%v) was called.", i1)
 	return nil
 }
 
-func (*server) OutputArray(call ipc.Context) ([2]uint8, error) {
+func (*server) OutputArray(call ipc.ServerContext) ([2]uint8, error) {
 	vlog.VI(2).Info("COutputArray() was called.")
 	return [2]uint8{1, 2}, nil
 }
 
-func (*server) InputMap(call ipc.Context, i1 map[uint8]uint8) error {
+func (*server) InputMap(call ipc.ServerContext, i1 map[uint8]uint8) error {
 	vlog.VI(2).Info("CInputMap(%v) was called.", i1)
 	return nil
 }
 
-func (*server) OutputMap(call ipc.Context) (map[uint8]uint8, error) {
+func (*server) OutputMap(call ipc.ServerContext) (map[uint8]uint8, error) {
 	vlog.VI(2).Info("COutputMap() was called.")
 	return map[uint8]uint8{1: 2}, nil
 }
 
-func (*server) InputSlice(call ipc.Context, i1 []uint8) error {
+func (*server) InputSlice(call ipc.ServerContext, i1 []uint8) error {
 	vlog.VI(2).Info("CInputSlice(%v) was called.", i1)
 	return nil
 }
 
-func (*server) OutputSlice(call ipc.Context) ([]uint8, error) {
+func (*server) OutputSlice(call ipc.ServerContext) ([]uint8, error) {
 	vlog.VI(2).Info("COutputSlice() was called.")
 	return []uint8{1, 2}, nil
 }
 
-func (*server) InputStruct(call ipc.Context, i1 test_base.Struct) error {
+func (*server) InputStruct(call ipc.ServerContext, i1 test_base.Struct) error {
 	vlog.VI(2).Info("CInputStruct(%v) was called.", i1)
 	return nil
 }
 
-func (*server) OutputStruct(call ipc.Context) (test_base.Struct, error) {
+func (*server) OutputStruct(call ipc.ServerContext) (test_base.Struct, error) {
 	vlog.VI(2).Info("COutputStruct() was called.")
 	return test_base.Struct{X: 1, Y: 2}, nil
 }
 
-func (*server) NoArguments(call ipc.Context) error {
+func (*server) NoArguments(call ipc.ServerContext) error {
 	vlog.VI(2).Info("NoArguments() was called.")
 	return nil
 }
 
-func (*server) MultipleArguments(call ipc.Context, i1, i2 int32) (int32, int32, error) {
+func (*server) MultipleArguments(call ipc.ServerContext, i1, i2 int32) (int32, int32, error) {
 	vlog.VI(2).Info("MultipleArguments(%v,%v) was called.", i1, i2)
 	return i1, i2, nil
 }
 
-func (*server) StreamingOutput(call ipc.Context, nStream int32, item bool, reply test_base.TypeTesterServiceStreamingOutputStream) error {
+func (*server) StreamingOutput(call ipc.ServerContext, nStream int32, item bool, reply test_base.TypeTesterServiceStreamingOutputStream) error {
 	vlog.VI(2).Info("StreamingOutput(%v,%v) was called.", nStream, item)
 	for i := int32(0); i < nStream; i++ {
 		reply.Send(item)
diff --git a/tools/vrpc/test_base/test_base.vdl.go b/tools/vrpc/test_base/test_base.vdl.go
index b3fcdc5..8334c68 100644
--- a/tools/vrpc/test_base/test_base.vdl.go
+++ b/tools/vrpc/test_base/test_base.vdl.go
@@ -23,29 +23,29 @@
 // to enable embedding without method collisions.  Not to be used directly by clients.
 type TypeTester_ExcludingUniversal interface {
 	// Methods to test support for generic types.
-	Bool(I1 bool, opts ..._gen_ipc.ClientCallOpt) (reply bool, err error)
-	Float32(I1 float32, opts ..._gen_ipc.ClientCallOpt) (reply float32, err error)
-	Float64(I1 float64, opts ..._gen_ipc.ClientCallOpt) (reply float64, err error)
-	Int32(I1 int32, opts ..._gen_ipc.ClientCallOpt) (reply int32, err error)
-	Int64(I1 int64, opts ..._gen_ipc.ClientCallOpt) (reply int64, err error)
-	String(I1 string, opts ..._gen_ipc.ClientCallOpt) (reply string, err error)
-	Byte(I1 byte, opts ..._gen_ipc.ClientCallOpt) (reply byte, err error)
-	UInt32(I1 uint32, opts ..._gen_ipc.ClientCallOpt) (reply uint32, err error)
-	UInt64(I1 uint64, opts ..._gen_ipc.ClientCallOpt) (reply uint64, err error)
+	Bool(ctx _gen_ipc.Context, I1 bool, opts ..._gen_ipc.CallOpt) (reply bool, err error)
+	Float32(ctx _gen_ipc.Context, I1 float32, opts ..._gen_ipc.CallOpt) (reply float32, err error)
+	Float64(ctx _gen_ipc.Context, I1 float64, opts ..._gen_ipc.CallOpt) (reply float64, err error)
+	Int32(ctx _gen_ipc.Context, I1 int32, opts ..._gen_ipc.CallOpt) (reply int32, err error)
+	Int64(ctx _gen_ipc.Context, I1 int64, opts ..._gen_ipc.CallOpt) (reply int64, err error)
+	String(ctx _gen_ipc.Context, I1 string, opts ..._gen_ipc.CallOpt) (reply string, err error)
+	Byte(ctx _gen_ipc.Context, I1 byte, opts ..._gen_ipc.CallOpt) (reply byte, err error)
+	UInt32(ctx _gen_ipc.Context, I1 uint32, opts ..._gen_ipc.CallOpt) (reply uint32, err error)
+	UInt64(ctx _gen_ipc.Context, I1 uint64, opts ..._gen_ipc.CallOpt) (reply uint64, err error)
 	// Methods to test support for composite types.
-	InputArray(I1 [2]byte, opts ..._gen_ipc.ClientCallOpt) (err error)
-	InputMap(I1 map[byte]byte, opts ..._gen_ipc.ClientCallOpt) (err error)
-	InputSlice(I1 []byte, opts ..._gen_ipc.ClientCallOpt) (err error)
-	InputStruct(I1 Struct, opts ..._gen_ipc.ClientCallOpt) (err error)
-	OutputArray(opts ..._gen_ipc.ClientCallOpt) (reply [2]byte, err error)
-	OutputMap(opts ..._gen_ipc.ClientCallOpt) (reply map[byte]byte, err error)
-	OutputSlice(opts ..._gen_ipc.ClientCallOpt) (reply []byte, err error)
-	OutputStruct(opts ..._gen_ipc.ClientCallOpt) (reply Struct, err error)
+	InputArray(ctx _gen_ipc.Context, I1 [2]byte, opts ..._gen_ipc.CallOpt) (err error)
+	InputMap(ctx _gen_ipc.Context, I1 map[byte]byte, opts ..._gen_ipc.CallOpt) (err error)
+	InputSlice(ctx _gen_ipc.Context, I1 []byte, opts ..._gen_ipc.CallOpt) (err error)
+	InputStruct(ctx _gen_ipc.Context, I1 Struct, opts ..._gen_ipc.CallOpt) (err error)
+	OutputArray(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply [2]byte, err error)
+	OutputMap(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply map[byte]byte, err error)
+	OutputSlice(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply []byte, err error)
+	OutputStruct(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply Struct, err error)
 	// Methods to test support for different number of arguments.
-	NoArguments(opts ..._gen_ipc.ClientCallOpt) (err error)
-	MultipleArguments(I1 int32, I2 int32, opts ..._gen_ipc.ClientCallOpt) (O1 int32, O2 int32, err error)
+	NoArguments(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (err error)
+	MultipleArguments(ctx _gen_ipc.Context, I1 int32, I2 int32, opts ..._gen_ipc.CallOpt) (O1 int32, O2 int32, err error)
 	// Methods to test support for streaming.
-	StreamingOutput(NumStreamItems int32, StreamItem bool, opts ..._gen_ipc.ClientCallOpt) (reply TypeTesterStreamingOutputStream, err error)
+	StreamingOutput(ctx _gen_ipc.Context, NumStreamItems int32, StreamItem bool, opts ..._gen_ipc.CallOpt) (reply TypeTesterStreamingOutputStream, err error)
 }
 type TypeTester interface {
 	_gen_ipc.UniversalServiceMethods
@@ -56,29 +56,29 @@
 type TypeTesterService interface {
 
 	// Methods to test support for generic types.
-	Bool(context _gen_ipc.Context, I1 bool) (reply bool, err error)
-	Float32(context _gen_ipc.Context, I1 float32) (reply float32, err error)
-	Float64(context _gen_ipc.Context, I1 float64) (reply float64, err error)
-	Int32(context _gen_ipc.Context, I1 int32) (reply int32, err error)
-	Int64(context _gen_ipc.Context, I1 int64) (reply int64, err error)
-	String(context _gen_ipc.Context, I1 string) (reply string, err error)
-	Byte(context _gen_ipc.Context, I1 byte) (reply byte, err error)
-	UInt32(context _gen_ipc.Context, I1 uint32) (reply uint32, err error)
-	UInt64(context _gen_ipc.Context, I1 uint64) (reply uint64, err error)
+	Bool(context _gen_ipc.ServerContext, I1 bool) (reply bool, err error)
+	Float32(context _gen_ipc.ServerContext, I1 float32) (reply float32, err error)
+	Float64(context _gen_ipc.ServerContext, I1 float64) (reply float64, err error)
+	Int32(context _gen_ipc.ServerContext, I1 int32) (reply int32, err error)
+	Int64(context _gen_ipc.ServerContext, I1 int64) (reply int64, err error)
+	String(context _gen_ipc.ServerContext, I1 string) (reply string, err error)
+	Byte(context _gen_ipc.ServerContext, I1 byte) (reply byte, err error)
+	UInt32(context _gen_ipc.ServerContext, I1 uint32) (reply uint32, err error)
+	UInt64(context _gen_ipc.ServerContext, I1 uint64) (reply uint64, err error)
 	// Methods to test support for composite types.
-	InputArray(context _gen_ipc.Context, I1 [2]byte) (err error)
-	InputMap(context _gen_ipc.Context, I1 map[byte]byte) (err error)
-	InputSlice(context _gen_ipc.Context, I1 []byte) (err error)
-	InputStruct(context _gen_ipc.Context, I1 Struct) (err error)
-	OutputArray(context _gen_ipc.Context) (reply [2]byte, err error)
-	OutputMap(context _gen_ipc.Context) (reply map[byte]byte, err error)
-	OutputSlice(context _gen_ipc.Context) (reply []byte, err error)
-	OutputStruct(context _gen_ipc.Context) (reply Struct, err error)
+	InputArray(context _gen_ipc.ServerContext, I1 [2]byte) (err error)
+	InputMap(context _gen_ipc.ServerContext, I1 map[byte]byte) (err error)
+	InputSlice(context _gen_ipc.ServerContext, I1 []byte) (err error)
+	InputStruct(context _gen_ipc.ServerContext, I1 Struct) (err error)
+	OutputArray(context _gen_ipc.ServerContext) (reply [2]byte, err error)
+	OutputMap(context _gen_ipc.ServerContext) (reply map[byte]byte, err error)
+	OutputSlice(context _gen_ipc.ServerContext) (reply []byte, err error)
+	OutputStruct(context _gen_ipc.ServerContext) (reply Struct, err error)
 	// Methods to test support for different number of arguments.
-	NoArguments(context _gen_ipc.Context) (err error)
-	MultipleArguments(context _gen_ipc.Context, I1 int32, I2 int32) (O1 int32, O2 int32, err error)
+	NoArguments(context _gen_ipc.ServerContext) (err error)
+	MultipleArguments(context _gen_ipc.ServerContext, I1 int32, I2 int32) (O1 int32, O2 int32, err error)
 	// Methods to test support for streaming.
-	StreamingOutput(context _gen_ipc.Context, NumStreamItems int32, StreamItem bool, stream TypeTesterServiceStreamingOutputStream) (err error)
+	StreamingOutput(context _gen_ipc.ServerContext, NumStreamItems int32, StreamItem bool, stream TypeTesterServiceStreamingOutputStream) (err error)
 }
 
 // TypeTesterStreamingOutputStream is the interface for streaming responses of the method
@@ -99,7 +99,7 @@
 
 // Implementation of the TypeTesterStreamingOutputStream interface that is not exported.
 type implTypeTesterStreamingOutputStream struct {
-	clientCall _gen_ipc.ClientCall
+	clientCall _gen_ipc.Call
 }
 
 func (c *implTypeTesterStreamingOutputStream) Recv() (item bool, err error) {
@@ -178,9 +178,9 @@
 	name   string
 }
 
-func (__gen_c *clientStubTypeTester) Bool(I1 bool, opts ..._gen_ipc.ClientCallOpt) (reply bool, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "Bool", []interface{}{I1}, opts...); err != nil {
+func (__gen_c *clientStubTypeTester) Bool(ctx _gen_ipc.Context, I1 bool, opts ..._gen_ipc.CallOpt) (reply bool, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "Bool", []interface{}{I1}, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -189,9 +189,9 @@
 	return
 }
 
-func (__gen_c *clientStubTypeTester) Float32(I1 float32, opts ..._gen_ipc.ClientCallOpt) (reply float32, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "Float32", []interface{}{I1}, opts...); err != nil {
+func (__gen_c *clientStubTypeTester) Float32(ctx _gen_ipc.Context, I1 float32, opts ..._gen_ipc.CallOpt) (reply float32, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "Float32", []interface{}{I1}, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -200,9 +200,9 @@
 	return
 }
 
-func (__gen_c *clientStubTypeTester) Float64(I1 float64, opts ..._gen_ipc.ClientCallOpt) (reply float64, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "Float64", []interface{}{I1}, opts...); err != nil {
+func (__gen_c *clientStubTypeTester) Float64(ctx _gen_ipc.Context, I1 float64, opts ..._gen_ipc.CallOpt) (reply float64, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "Float64", []interface{}{I1}, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -211,9 +211,9 @@
 	return
 }
 
-func (__gen_c *clientStubTypeTester) Int32(I1 int32, opts ..._gen_ipc.ClientCallOpt) (reply int32, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "Int32", []interface{}{I1}, opts...); err != nil {
+func (__gen_c *clientStubTypeTester) Int32(ctx _gen_ipc.Context, I1 int32, opts ..._gen_ipc.CallOpt) (reply int32, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "Int32", []interface{}{I1}, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -222,9 +222,9 @@
 	return
 }
 
-func (__gen_c *clientStubTypeTester) Int64(I1 int64, opts ..._gen_ipc.ClientCallOpt) (reply int64, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "Int64", []interface{}{I1}, opts...); err != nil {
+func (__gen_c *clientStubTypeTester) Int64(ctx _gen_ipc.Context, I1 int64, opts ..._gen_ipc.CallOpt) (reply int64, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "Int64", []interface{}{I1}, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -233,9 +233,9 @@
 	return
 }
 
-func (__gen_c *clientStubTypeTester) String(I1 string, opts ..._gen_ipc.ClientCallOpt) (reply string, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "String", []interface{}{I1}, opts...); err != nil {
+func (__gen_c *clientStubTypeTester) String(ctx _gen_ipc.Context, I1 string, opts ..._gen_ipc.CallOpt) (reply string, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "String", []interface{}{I1}, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -244,9 +244,9 @@
 	return
 }
 
-func (__gen_c *clientStubTypeTester) Byte(I1 byte, opts ..._gen_ipc.ClientCallOpt) (reply byte, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "Byte", []interface{}{I1}, opts...); err != nil {
+func (__gen_c *clientStubTypeTester) Byte(ctx _gen_ipc.Context, I1 byte, opts ..._gen_ipc.CallOpt) (reply byte, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "Byte", []interface{}{I1}, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -255,9 +255,9 @@
 	return
 }
 
-func (__gen_c *clientStubTypeTester) UInt32(I1 uint32, opts ..._gen_ipc.ClientCallOpt) (reply uint32, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "UInt32", []interface{}{I1}, opts...); err != nil {
+func (__gen_c *clientStubTypeTester) UInt32(ctx _gen_ipc.Context, I1 uint32, opts ..._gen_ipc.CallOpt) (reply uint32, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "UInt32", []interface{}{I1}, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -266,9 +266,9 @@
 	return
 }
 
-func (__gen_c *clientStubTypeTester) UInt64(I1 uint64, opts ..._gen_ipc.ClientCallOpt) (reply uint64, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "UInt64", []interface{}{I1}, opts...); err != nil {
+func (__gen_c *clientStubTypeTester) UInt64(ctx _gen_ipc.Context, I1 uint64, opts ..._gen_ipc.CallOpt) (reply uint64, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "UInt64", []interface{}{I1}, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -277,9 +277,9 @@
 	return
 }
 
-func (__gen_c *clientStubTypeTester) InputArray(I1 [2]byte, opts ..._gen_ipc.ClientCallOpt) (err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "InputArray", []interface{}{I1}, opts...); err != nil {
+func (__gen_c *clientStubTypeTester) InputArray(ctx _gen_ipc.Context, I1 [2]byte, opts ..._gen_ipc.CallOpt) (err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "InputArray", []interface{}{I1}, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&err); ierr != nil {
@@ -288,9 +288,9 @@
 	return
 }
 
-func (__gen_c *clientStubTypeTester) InputMap(I1 map[byte]byte, opts ..._gen_ipc.ClientCallOpt) (err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "InputMap", []interface{}{I1}, opts...); err != nil {
+func (__gen_c *clientStubTypeTester) InputMap(ctx _gen_ipc.Context, I1 map[byte]byte, opts ..._gen_ipc.CallOpt) (err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "InputMap", []interface{}{I1}, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&err); ierr != nil {
@@ -299,9 +299,9 @@
 	return
 }
 
-func (__gen_c *clientStubTypeTester) InputSlice(I1 []byte, opts ..._gen_ipc.ClientCallOpt) (err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "InputSlice", []interface{}{I1}, opts...); err != nil {
+func (__gen_c *clientStubTypeTester) InputSlice(ctx _gen_ipc.Context, I1 []byte, opts ..._gen_ipc.CallOpt) (err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "InputSlice", []interface{}{I1}, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&err); ierr != nil {
@@ -310,9 +310,9 @@
 	return
 }
 
-func (__gen_c *clientStubTypeTester) InputStruct(I1 Struct, opts ..._gen_ipc.ClientCallOpt) (err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "InputStruct", []interface{}{I1}, opts...); err != nil {
+func (__gen_c *clientStubTypeTester) InputStruct(ctx _gen_ipc.Context, I1 Struct, opts ..._gen_ipc.CallOpt) (err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "InputStruct", []interface{}{I1}, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&err); ierr != nil {
@@ -321,9 +321,9 @@
 	return
 }
 
-func (__gen_c *clientStubTypeTester) OutputArray(opts ..._gen_ipc.ClientCallOpt) (reply [2]byte, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "OutputArray", nil, opts...); err != nil {
+func (__gen_c *clientStubTypeTester) OutputArray(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply [2]byte, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "OutputArray", nil, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -332,9 +332,9 @@
 	return
 }
 
-func (__gen_c *clientStubTypeTester) OutputMap(opts ..._gen_ipc.ClientCallOpt) (reply map[byte]byte, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "OutputMap", nil, opts...); err != nil {
+func (__gen_c *clientStubTypeTester) OutputMap(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply map[byte]byte, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "OutputMap", nil, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -343,9 +343,9 @@
 	return
 }
 
-func (__gen_c *clientStubTypeTester) OutputSlice(opts ..._gen_ipc.ClientCallOpt) (reply []byte, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "OutputSlice", nil, opts...); err != nil {
+func (__gen_c *clientStubTypeTester) OutputSlice(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply []byte, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "OutputSlice", nil, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -354,9 +354,9 @@
 	return
 }
 
-func (__gen_c *clientStubTypeTester) OutputStruct(opts ..._gen_ipc.ClientCallOpt) (reply Struct, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "OutputStruct", nil, opts...); err != nil {
+func (__gen_c *clientStubTypeTester) OutputStruct(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply Struct, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "OutputStruct", nil, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -365,9 +365,9 @@
 	return
 }
 
-func (__gen_c *clientStubTypeTester) NoArguments(opts ..._gen_ipc.ClientCallOpt) (err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "NoArguments", nil, opts...); err != nil {
+func (__gen_c *clientStubTypeTester) NoArguments(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "NoArguments", nil, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&err); ierr != nil {
@@ -376,9 +376,9 @@
 	return
 }
 
-func (__gen_c *clientStubTypeTester) MultipleArguments(I1 int32, I2 int32, opts ..._gen_ipc.ClientCallOpt) (O1 int32, O2 int32, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "MultipleArguments", []interface{}{I1, I2}, opts...); err != nil {
+func (__gen_c *clientStubTypeTester) MultipleArguments(ctx _gen_ipc.Context, I1 int32, I2 int32, opts ..._gen_ipc.CallOpt) (O1 int32, O2 int32, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "MultipleArguments", []interface{}{I1, I2}, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&O1, &O2, &err); ierr != nil {
@@ -387,18 +387,18 @@
 	return
 }
 
-func (__gen_c *clientStubTypeTester) StreamingOutput(NumStreamItems int32, StreamItem bool, opts ..._gen_ipc.ClientCallOpt) (reply TypeTesterStreamingOutputStream, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "StreamingOutput", []interface{}{NumStreamItems, StreamItem}, opts...); err != nil {
+func (__gen_c *clientStubTypeTester) StreamingOutput(ctx _gen_ipc.Context, NumStreamItems int32, StreamItem bool, opts ..._gen_ipc.CallOpt) (reply TypeTesterStreamingOutputStream, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "StreamingOutput", []interface{}{NumStreamItems, StreamItem}, opts...); err != nil {
 		return
 	}
 	reply = &implTypeTesterStreamingOutputStream{clientCall: call}
 	return
 }
 
-func (__gen_c *clientStubTypeTester) UnresolveStep(opts ..._gen_ipc.ClientCallOpt) (reply []string, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "UnresolveStep", nil, opts...); err != nil {
+func (__gen_c *clientStubTypeTester) UnresolveStep(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply []string, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "UnresolveStep", nil, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -407,9 +407,9 @@
 	return
 }
 
-func (__gen_c *clientStubTypeTester) Signature(opts ..._gen_ipc.ClientCallOpt) (reply _gen_ipc.ServiceSignature, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "Signature", nil, opts...); err != nil {
+func (__gen_c *clientStubTypeTester) Signature(ctx _gen_ipc.Context, opts ..._gen_ipc.CallOpt) (reply _gen_ipc.ServiceSignature, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "Signature", nil, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {
@@ -418,9 +418,9 @@
 	return
 }
 
-func (__gen_c *clientStubTypeTester) GetMethodTags(method string, opts ..._gen_ipc.ClientCallOpt) (reply []interface{}, err error) {
-	var call _gen_ipc.ClientCall
-	if call, err = __gen_c.client.StartCall(__gen_c.name, "GetMethodTags", []interface{}{method}, opts...); err != nil {
+func (__gen_c *clientStubTypeTester) GetMethodTags(ctx _gen_ipc.Context, method string, opts ..._gen_ipc.CallOpt) (reply []interface{}, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "GetMethodTags", []interface{}{method}, opts...); err != nil {
 		return
 	}
 	if ierr := call.Finish(&reply, &err); ierr != nil {