Browse Source

Updated amber. Fixed for Symbol removal - use 1el Array instead.

Herbert Vojčík 11 years ago
parent
commit
ad7afdcc5d

+ 164 - 92
lib/js/Trapped-Backend.deploy.js

@@ -6,7 +6,8 @@ smalltalk.method({
 selector: "getBlock:",
 fn: function (aBlock){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
self["@getBlock"]=aBlock;
+return smalltalk.withContext(function($ctx1) { 
+self["@getBlock"]=aBlock;
 return self}, function($ctx1) {$ctx1.fill(self,"getBlock:",{aBlock:aBlock},smalltalk.EavModel)})},
 messageSends: []}),
 smalltalk.EavModel);
@@ -17,12 +18,15 @@ smalltalk.method({
 selector: "initialize",
 fn: function (){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
smalltalk.Object.fn.prototype._initialize.apply(_st(self), []);
+return smalltalk.withContext(function($ctx1) { 
+smalltalk.Object.fn.prototype._initialize.apply(_st(self), []);
 self["@getBlock"]=(function(){
-return smalltalk.withContext(function($ctx2) {
return _st(self)._error_("No getter block.");
+return smalltalk.withContext(function($ctx2) {
+return _st(self)._error_("No getter block.");
 }, function($ctx2) {$ctx2.fillBlock({},$ctx1)})});
 self["@putBlock"]=(function(){
-return smalltalk.withContext(function($ctx2) {
return _st(self)._error_("No putter block.");
+return smalltalk.withContext(function($ctx2) {
+return _st(self)._error_("No putter block.");
 }, function($ctx2) {$ctx2.fillBlock({},$ctx1)})});
 return self}, function($ctx1) {$ctx1.fill(self,"initialize",{},smalltalk.EavModel)})},
 messageSends: ["initialize", "error:"]}),
@@ -34,7 +38,8 @@ smalltalk.method({
 selector: "on:",
 fn: function (anObject){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1;
+return smalltalk.withContext(function($ctx1) { 
+var $1;
 $1=_st(self["@getBlock"])._value_(anObject);
 return $1;
 }, function($ctx1) {$ctx1.fill(self,"on:",{anObject:anObject},smalltalk.EavModel)})},
@@ -47,7 +52,8 @@ smalltalk.method({
 selector: "on:put:",
 fn: function (anObject,anObject2){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1;
+return smalltalk.withContext(function($ctx1) { 
+var $1;
 $1=_st(self["@putBlock"])._value_value_(anObject,anObject2);
 return $1;
 }, function($ctx1) {$ctx1.fill(self,"on:put:",{anObject:anObject,anObject2:anObject2},smalltalk.EavModel)})},
@@ -60,7 +66,8 @@ smalltalk.method({
 selector: "putBlock:",
 fn: function (aBlock){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
self["@putBlock"]=aBlock;
+return smalltalk.withContext(function($ctx1) { 
+self["@putBlock"]=aBlock;
 return self}, function($ctx1) {$ctx1.fill(self,"putBlock:",{aBlock:aBlock},smalltalk.EavModel)})},
 messageSends: []}),
 smalltalk.EavModel);
@@ -75,7 +82,8 @@ selector: "model:modify:",
 fn: function (anEavModel,aBlock){
 var self=this;
 var newValue;
-return smalltalk.withContext(function($ctx1) { 
newValue=_st(aBlock)._value_(_st(anEavModel)._on_(self));
+return smalltalk.withContext(function($ctx1) { 
+newValue=_st(aBlock)._value_(_st(anEavModel)._on_(self));
 _st(anEavModel)._on_put_(self,_st(newValue)._deepCopy());
 return self}, function($ctx1) {$ctx1.fill(self,"model:modify:",{anEavModel:anEavModel,aBlock:aBlock,newValue:newValue},smalltalk.Isolator)})},
 messageSends: ["value:", "on:", "on:put:", "deepCopy"]}),
@@ -87,7 +95,8 @@ smalltalk.method({
 selector: "model:read:",
 fn: function (anEavModel,aBlock){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
_st(aBlock)._value_(_st(_st(anEavModel)._on_(self))._deepCopy());
+return smalltalk.withContext(function($ctx1) { 
+_st(aBlock)._value_(_st(_st(anEavModel)._on_(self))._deepCopy());
 return self}, function($ctx1) {$ctx1.fill(self,"model:read:",{anEavModel:anEavModel,aBlock:aBlock},smalltalk.Isolator)})},
 messageSends: ["value:", "deepCopy", "on:"]}),
 smalltalk.Isolator);
@@ -98,7 +107,8 @@ smalltalk.method({
 selector: "root",
 fn: function (){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1;
+return smalltalk.withContext(function($ctx1) { 
+var $1;
 $1=self["@root"];
 return $1;
 }, function($ctx1) {$ctx1.fill(self,"root",{},smalltalk.Isolator)})},
@@ -111,7 +121,8 @@ smalltalk.method({
 selector: "root:",
 fn: function (anObject){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
self["@root"]=anObject;
+return smalltalk.withContext(function($ctx1) { 
+self["@root"]=anObject;
 return self}, function($ctx1) {$ctx1.fill(self,"root:",{anObject:anObject},smalltalk.Isolator)})},
 messageSends: []}),
 smalltalk.Isolator);
@@ -123,7 +134,8 @@ smalltalk.method({
 selector: "on:",
 fn: function (anObject){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1;
+return smalltalk.withContext(function($ctx1) { 
+var $1;
 $1=_st(_st(self)._new())._root_(anObject);
 return $1;
 }, function($ctx1) {$ctx1.fill(self,"on:",{anObject:anObject},smalltalk.Isolator.klass)})},
@@ -139,10 +151,12 @@ selector: "changed:",
 fn: function (key){
 var self=this;
 var needsToRun;
-return smalltalk.withContext(function($ctx1) { 
var $1;
+return smalltalk.withContext(function($ctx1) { 
+var $1;
 needsToRun=false;
 _st(self)._do_((function(each){
-return smalltalk.withContext(function($ctx2) {
$1=_st(each)._accepts_(key);
+return smalltalk.withContext(function($ctx2) {
+$1=_st(each)._accepts_(key);
 if(smalltalk.assert($1)){
 _st(each)._flag();
 needsToRun=true;
@@ -160,11 +174,13 @@ smalltalk.method({
 selector: "dirty:",
 fn: function (aBoolean){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1;
+return smalltalk.withContext(function($ctx1) { 
+var $1;
 $1=aBoolean;
 if(smalltalk.assert($1)){
 _st((function(){
-return smalltalk.withContext(function($ctx2) {
return _st(self)._run();
+return smalltalk.withContext(function($ctx2) {
+return _st(self)._run();
 }, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}))._fork();
 };
 return self}, function($ctx1) {$ctx1.fill(self,"dirty:",{aBoolean:aBoolean},smalltalk.KeyedPubSubBase)})},
@@ -177,7 +193,8 @@ smalltalk.method({
 selector: "on:hook:",
 fn: function (key,aBlock){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
_st(self)._add_(_st(_st(self["@factory"])._value_value_(key,aBlock))._flag());
+return smalltalk.withContext(function($ctx1) { 
+_st(self)._add_(_st(_st(self["@factory"])._value_value_(key,aBlock))._flag());
 _st(self)._dirty_(true);
 return self}, function($ctx1) {$ctx1.fill(self,"on:hook:",{key:key,aBlock:aBlock},smalltalk.KeyedPubSubBase)})},
 messageSends: ["add:", "flag", "value:value:", "dirty:"]}),
@@ -190,10 +207,12 @@ selector: "run",
 fn: function (){
 var self=this;
 var needsClean;
-return smalltalk.withContext(function($ctx1) { 
var $1,$2,$3;
+return smalltalk.withContext(function($ctx1) { 
+var $1,$2,$3;
 needsClean=false;
 _st(self)._do_((function(each){
-return smalltalk.withContext(function($ctx2) {
$1=_st(each)._isFlagged();
+return smalltalk.withContext(function($ctx2) {
+$1=_st(each)._isFlagged();
 if(smalltalk.assert($1)){
 _st(each)._run();
 $2=_st(each)._isEnabled();
@@ -217,7 +236,8 @@ smalltalk.method({
 selector: "subscriptionFactory:",
 fn: function (aBlock){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
self["@factory"]=aBlock;
+return smalltalk.withContext(function($ctx1) { 
+self["@factory"]=aBlock;
 return self}, function($ctx1) {$ctx1.fill(self,"subscriptionFactory:",{aBlock:aBlock},smalltalk.KeyedPubSubBase)})},
 messageSends: []}),
 smalltalk.KeyedPubSubBase);
@@ -231,7 +251,8 @@ smalltalk.method({
 selector: "add:",
 fn: function (aSubscription){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
_st(self["@queue"])._add_(aSubscription);
+return smalltalk.withContext(function($ctx1) { 
+_st(self["@queue"])._add_(aSubscription);
 return self}, function($ctx1) {$ctx1.fill(self,"add:",{aSubscription:aSubscription},smalltalk.SimpleKeyedPubSub)})},
 messageSends: ["add:"]}),
 smalltalk.SimpleKeyedPubSub);
@@ -242,8 +263,10 @@ smalltalk.method({
 selector: "clean",
 fn: function (){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
self["@queue"]=_st(self["@queue"])._select_((function(each){
-return smalltalk.withContext(function($ctx2) {
return _st(each)._isEnabled();
+return smalltalk.withContext(function($ctx1) { 
+self["@queue"]=_st(self["@queue"])._select_((function(each){
+return smalltalk.withContext(function($ctx2) {
+return _st(each)._isEnabled();
 }, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1)})}));
 return self}, function($ctx1) {$ctx1.fill(self,"clean",{},smalltalk.SimpleKeyedPubSub)})},
 messageSends: ["select:", "isEnabled"]}),
@@ -255,7 +278,8 @@ smalltalk.method({
 selector: "do:",
 fn: function (aBlock){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
_st(self["@queue"])._do_(aBlock);
+return smalltalk.withContext(function($ctx1) { 
+_st(self["@queue"])._do_(aBlock);
 return self}, function($ctx1) {$ctx1.fill(self,"do:",{aBlock:aBlock},smalltalk.SimpleKeyedPubSub)})},
 messageSends: ["do:"]}),
 smalltalk.SimpleKeyedPubSub);
@@ -266,7 +290,8 @@ smalltalk.method({
 selector: "initialize",
 fn: function (){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
smalltalk.KeyedPubSubBase.fn.prototype._initialize.apply(_st(self), []);
+return smalltalk.withContext(function($ctx1) { 
+smalltalk.KeyedPubSubBase.fn.prototype._initialize.apply(_st(self), []);
 self["@queue"]=_st((smalltalk.OrderedCollection || OrderedCollection))._new();
 return self}, function($ctx1) {$ctx1.fill(self,"initialize",{},smalltalk.SimpleKeyedPubSub)})},
 messageSends: ["initialize", "new"]}),
@@ -284,7 +309,8 @@ smalltalk.method({
 selector: "accepts:",
 fn: function (aKey){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
_st(self)._subclassResponsibility();
+return smalltalk.withContext(function($ctx1) { 
+_st(self)._subclassResponsibility();
 return self}, function($ctx1) {$ctx1.fill(self,"accepts:",{aKey:aKey},smalltalk.KeyedSubscriptionBase)})},
 messageSends: ["subclassResponsibility"]}),
 smalltalk.KeyedSubscriptionBase);
@@ -295,7 +321,8 @@ smalltalk.method({
 selector: "flag",
 fn: function (){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
self["@flagged"]=true;
+return smalltalk.withContext(function($ctx1) { 
+self["@flagged"]=true;
 return self}, function($ctx1) {$ctx1.fill(self,"flag",{},smalltalk.KeyedSubscriptionBase)})},
 messageSends: []}),
 smalltalk.KeyedSubscriptionBase);
@@ -306,7 +333,8 @@ smalltalk.method({
 selector: "initialize",
 fn: function (){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
smalltalk.Object.fn.prototype._initialize.apply(_st(self), []);
+return smalltalk.withContext(function($ctx1) { 
+smalltalk.Object.fn.prototype._initialize.apply(_st(self), []);
 self["@key"]=nil;
 self["@actionBlock"]=nil;
 self["@flagged"]=false;
@@ -320,7 +348,8 @@ smalltalk.method({
 selector: "isEnabled",
 fn: function (){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1;
+return smalltalk.withContext(function($ctx1) { 
+var $1;
 $1=_st(self["@actionBlock"])._notNil();
 return $1;
 }, function($ctx1) {$ctx1.fill(self,"isEnabled",{},smalltalk.KeyedSubscriptionBase)})},
@@ -333,7 +362,8 @@ smalltalk.method({
 selector: "isFlagged",
 fn: function (){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1;
+return smalltalk.withContext(function($ctx1) { 
+var $1;
 $1=self["@flagged"];
 return $1;
 }, function($ctx1) {$ctx1.fill(self,"isFlagged",{},smalltalk.KeyedSubscriptionBase)})},
@@ -346,7 +376,8 @@ smalltalk.method({
 selector: "key:block:",
 fn: function (anObject,aBlock){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
self["@key"]=anObject;
+return smalltalk.withContext(function($ctx1) { 
+self["@key"]=anObject;
 self["@actionBlock"]=aBlock;
 return self}, function($ctx1) {$ctx1.fill(self,"key:block:",{anObject:anObject,aBlock:aBlock},smalltalk.KeyedSubscriptionBase)})},
 messageSends: []}),
@@ -358,15 +389,20 @@ smalltalk.method({
 selector: "run",
 fn: function (){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
_st((function(){
-return smalltalk.withContext(function($ctx2) {
return _st((function(){
-return smalltalk.withContext(function($ctx3) {
return _st(self["@actionBlock"])._value();
+return smalltalk.withContext(function($ctx1) { 
+_st((function(){
+return smalltalk.withContext(function($ctx2) {
+return _st((function(){
+return smalltalk.withContext(function($ctx3) {
+return _st(self["@actionBlock"])._value();
 }, function($ctx3) {$ctx3.fillBlock({},$ctx1)})}))._ensure_((function(){
-return smalltalk.withContext(function($ctx3) {
self["@flagged"]=false;
+return smalltalk.withContext(function($ctx3) {
+self["@flagged"]=false;
 return self["@flagged"];
 }, function($ctx3) {$ctx3.fillBlock({},$ctx1)})}));
 }, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}))._on_do_((smalltalk.KeyedPubSubUnsubscribe || KeyedPubSubUnsubscribe),(function(){
-return smalltalk.withContext(function($ctx2) {
self["@actionBlock"]=nil;
+return smalltalk.withContext(function($ctx2) {
+self["@actionBlock"]=nil;
 return self["@actionBlock"];
 }, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
 return self}, function($ctx1) {$ctx1.fill(self,"run",{},smalltalk.KeyedSubscriptionBase)})},
@@ -382,9 +418,11 @@ smalltalk.method({
 selector: "accepts:",
 fn: function (aKey){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1;
+return smalltalk.withContext(function($ctx1) { 
+var $1;
 $1=_st(_st(_st(aKey)._size()).__lt_eq(_st(self["@key"])._size()))._and_((function(){
-return smalltalk.withContext(function($ctx2) {
return _st(aKey).__eq(_st(self["@key"])._copyFrom_to_((1),_st(aKey)._size()));
+return smalltalk.withContext(function($ctx2) {
+return _st(aKey).__eq(_st(self["@key"])._copyFrom_to_((1),_st(aKey)._size()));
 }, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
 return $1;
 }, function($ctx1) {$ctx1.fill(self,"accepts:",{aKey:aKey},smalltalk.ListKeyedSubscription)})},
@@ -400,7 +438,8 @@ smalltalk.method({
 selector: "dispatcher",
 fn: function (){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1;
+return smalltalk.withContext(function($ctx1) { 
+var $1;
 $1=self["@dispatcher"];
 return $1;
 }, function($ctx1) {$ctx1.fill(self,"dispatcher",{},smalltalk.ListKeyedEntity)})},
@@ -413,10 +452,12 @@ smalltalk.method({
 selector: "dispatcher:",
 fn: function (aDispatcher){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1,$2,$3,$4;
+return smalltalk.withContext(function($ctx1) { 
+var $1,$2,$3,$4;
 $1=aDispatcher;
 _st($1)._subscriptionFactory_((function(key,block){
-return smalltalk.withContext(function($ctx2) {
$2=_st((smalltalk.ListKeyedSubscription || ListKeyedSubscription))._new();
+return smalltalk.withContext(function($ctx2) {
+$2=_st((smalltalk.ListKeyedSubscription || ListKeyedSubscription))._new();
 _st($2)._key_block_(key,block);
 $3=_st($2)._yourself();
 return $3;
@@ -433,7 +474,8 @@ smalltalk.method({
 selector: "model:",
 fn: function (anObject){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
self["@payload"]=anObject;
+return smalltalk.withContext(function($ctx1) { 
+self["@payload"]=anObject;
 _st(_st(self)._dispatcher())._changed_([]);
 return self}, function($ctx1) {$ctx1.fill(self,"model:",{anObject:anObject},smalltalk.ListKeyedEntity)})},
 messageSends: ["changed:", "dispatcher"]}),
@@ -445,8 +487,10 @@ smalltalk.method({
 selector: "watch:do:",
 fn: function (path,aBlock){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
_st(_st(self)._dispatcher())._on_hook_(path,(function(){
-return smalltalk.withContext(function($ctx2) {
return _st(self)._read_do_(path,aBlock);
+return smalltalk.withContext(function($ctx1) { 
+_st(_st(self)._dispatcher())._on_hook_(path,(function(){
+return smalltalk.withContext(function($ctx2) {
+return _st(self)._read_do_(path,aBlock);
 }, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
 return self}, function($ctx1) {$ctx1.fill(self,"watch:do:",{path:path,aBlock:aBlock},smalltalk.ListKeyedEntity)})},
 messageSends: ["on:hook:", "read:do:", "dispatcher"]}),
@@ -462,12 +506,15 @@ selector: "modify:do:",
 fn: function (path,aBlock){
 var self=this;
 var newValue,eavModel;
-return smalltalk.withContext(function($ctx1) { 
eavModel=_st(path)._asEavModel();
+return smalltalk.withContext(function($ctx1) { 
+eavModel=_st(path)._asEavModel();
 newValue=_st(aBlock)._value_(_st(eavModel)._on_(self["@payload"]));
 _st((function(){
-return smalltalk.withContext(function($ctx2) {
return _st(eavModel)._on_put_(self["@payload"],newValue);
+return smalltalk.withContext(function($ctx2) {
+return _st(eavModel)._on_put_(self["@payload"],newValue);
 }, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}))._ensure_((function(){
-return smalltalk.withContext(function($ctx2) {
return _st(_st(self)._dispatcher())._changed_(path);
+return smalltalk.withContext(function($ctx2) {
+return _st(_st(self)._dispatcher())._changed_(path);
 }, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
 return self}, function($ctx1) {$ctx1.fill(self,"modify:do:",{path:path,aBlock:aBlock,newValue:newValue,eavModel:eavModel},smalltalk.ListKeyedDirectEntity)})},
 messageSends: ["asEavModel", "value:", "on:", "ensure:", "changed:", "dispatcher", "on:put:"]}),
@@ -480,7 +527,8 @@ selector: "read:do:",
 fn: function (path,aBlock){
 var self=this;
 var eavModel;
-return smalltalk.withContext(function($ctx1) { 
eavModel=_st(path)._asEavModel();
+return smalltalk.withContext(function($ctx1) { 
+eavModel=_st(path)._asEavModel();
 _st(aBlock)._value_(_st(eavModel)._on_(self["@payload"]));
 return self}, function($ctx1) {$ctx1.fill(self,"read:do:",{path:path,aBlock:aBlock,eavModel:eavModel},smalltalk.ListKeyedDirectEntity)})},
 messageSends: ["asEavModel", "value:", "on:"]}),
@@ -495,7 +543,8 @@ smalltalk.method({
 selector: "model:",
 fn: function (anObject){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
smalltalk.ListKeyedEntity.fn.prototype._model_.apply(_st(self), [_st((smalltalk.Isolator || Isolator))._on_(anObject)]);
+return smalltalk.withContext(function($ctx1) { 
+smalltalk.ListKeyedEntity.fn.prototype._model_.apply(_st(self), [_st((smalltalk.Isolator || Isolator))._on_(anObject)]);
 return self}, function($ctx1) {$ctx1.fill(self,"model:",{anObject:anObject},smalltalk.ListKeyedIsolatedEntity)})},
 messageSends: ["model:", "on:"]}),
 smalltalk.ListKeyedIsolatedEntity);
@@ -507,11 +556,14 @@ selector: "modify:do:",
 fn: function (path,aBlock){
 var self=this;
 var eavModel;
-return smalltalk.withContext(function($ctx1) { 
eavModel=_st(_st([smalltalk.symbolFor("root")]).__comma(path))._asEavModel();
+return smalltalk.withContext(function($ctx1) { 
+eavModel=_st(_st([["root"]]).__comma(path))._asEavModel();
 _st((function(){
-return smalltalk.withContext(function($ctx2) {
return _st(self["@payload"])._model_modify_(eavModel,aBlock);
+return smalltalk.withContext(function($ctx2) {
+return _st(self["@payload"])._model_modify_(eavModel,aBlock);
 }, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}))._ensure_((function(){
-return smalltalk.withContext(function($ctx2) {
return _st(_st(self)._dispatcher())._changed_(path);
+return smalltalk.withContext(function($ctx2) {
+return _st(_st(self)._dispatcher())._changed_(path);
 }, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
 return self}, function($ctx1) {$ctx1.fill(self,"modify:do:",{path:path,aBlock:aBlock,eavModel:eavModel},smalltalk.ListKeyedIsolatedEntity)})},
 messageSends: ["asEavModel", ",", "ensure:", "changed:", "dispatcher", "model:modify:"]}),
@@ -524,7 +576,8 @@ selector: "read:do:",
 fn: function (path,aBlock){
 var self=this;
 var eavModel;
-return smalltalk.withContext(function($ctx1) { 
eavModel=_st(_st([smalltalk.symbolFor("root")]).__comma(path))._asEavModel();
+return smalltalk.withContext(function($ctx1) { 
+eavModel=_st(_st([["root"]]).__comma(path))._asEavModel();
 _st(self["@payload"])._model_read_(eavModel,aBlock);
 return self}, function($ctx1) {$ctx1.fill(self,"read:do:",{path:path,aBlock:aBlock,eavModel:eavModel},smalltalk.ListKeyedIsolatedEntity)})},
 messageSends: ["asEavModel", ",", "model:read:"]}),
@@ -538,7 +591,8 @@ smalltalk.method({
 selector: "reverseTrapAt:",
 fn: function (anObject){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
return nil;
+return smalltalk.withContext(function($ctx1) { 
+return nil;
 }, function($ctx1) {$ctx1.fill(self,"reverseTrapAt:",{anObject:anObject}, smalltalk.Object)})},
 messageSends: []}),
 smalltalk.Object);
@@ -549,7 +603,8 @@ smalltalk.method({
 selector: "reverseTrapAt:put:",
 fn: function (anObject,value){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
_st(self)._error_(_st(_st("Trapped cannot put at ").__comma(_st(_st(self)._class())._name())).__comma(" type key."));
+return smalltalk.withContext(function($ctx1) { 
+_st(self)._error_(_st(_st("Trapped cannot put at ").__comma(_st(_st(self)._class())._name())).__comma(" type key."));
 return self}, function($ctx1) {$ctx1.fill(self,"reverseTrapAt:put:",{anObject:anObject,value:value}, smalltalk.Object)})},
 messageSends: ["error:", ",", "name", "class"]}),
 smalltalk.Object);
@@ -561,14 +616,17 @@ selector: "asEavModel",
 fn: function (){
 var self=this;
 var model;
-return smalltalk.withContext(function($ctx1) { 
var $1,$3,$4,$6,$5,$2,$7,$9,$11,$12,$14,$13,$10,$8,$15;
+return smalltalk.withContext(function($ctx1) { 
+var $1,$3,$4,$6,$5,$2,$7,$9,$11,$12,$14,$13,$10,$8,$15;
 model=_st((smalltalk.EavModel || EavModel))._new();
 $1=model;
 $2=(function(anObject){
-return smalltalk.withContext(function($ctx2) {
$3=self;
+return smalltalk.withContext(function($ctx2) {
+$3=self;
 $4=anObject;
 $5=(function(soFar,segment){
-return smalltalk.withContext(function($ctx3) {
$6=soFar;
+return smalltalk.withContext(function($ctx3) {
+$6=soFar;
 if(($receiver = $6) == nil || $receiver == undefined){
 return $6;
 } else {
@@ -580,13 +638,16 @@ return _st($3)._inject_into_($4,$5);
 _st($1)._getBlock_($2);
 $7=_st(self)._isEmpty();
 $8=(function(){
-return smalltalk.withContext(function($ctx2) {
$9=model;
+return smalltalk.withContext(function($ctx2) {
+$9=model;
 $10=(function(anObject,value){
 var penultimate;
-return smalltalk.withContext(function($ctx3) {
$11=_st(self)._allButLast();
+return smalltalk.withContext(function($ctx3) {
+$11=_st(self)._allButLast();
 $12=anObject;
 $13=(function(soFar,segment){
-return smalltalk.withContext(function($ctx4) {
$14=soFar;
+return smalltalk.withContext(function($ctx4) {
+$14=soFar;
 if(($receiver = $14) == nil || $receiver == undefined){
 return $14;
 } else {
@@ -612,14 +673,24 @@ smalltalk.method({
 selector: "reverseTrapAt:",
 fn: function (anObject){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1;
-$1=_st(anObject)._at_ifAbsent_(self,(function(){
-return smalltalk.withContext(function($ctx2) {
return nil;
+function $MessageNotUnderstood(){return smalltalk.MessageNotUnderstood||(typeof MessageNotUnderstood=="undefined"?nil:MessageNotUnderstood)}
+return smalltalk.withContext(function($ctx1) { 
+var $1;
+var $early={};
+try {
+$1=_st((function(){
+return smalltalk.withContext(function($ctx2) {
+return _st(anObject)._perform_(_st(self)._first());
+}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}))._on_do_($MessageNotUnderstood(),(function(){
+return smalltalk.withContext(function($ctx2) {
+throw $early=[nil];
 }, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
 return $1;
-}, function($ctx1) {$ctx1.fill(self,"reverseTrapAt:",{anObject:anObject}, smalltalk.String)})},
-messageSends: ["at:ifAbsent:"]}),
-smalltalk.String);
+}
+catch(e) {if(e===$early)return e[0]; throw e}
+}, function($ctx1) {$ctx1.fill(self,"reverseTrapAt:",{anObject:anObject},smalltalk.Array)})},
+messageSends: ["on:do:", "perform:", "first"]}),
+smalltalk.Array);
 
 smalltalk.addMethod(
 "_reverseTrapAt_put_",
@@ -627,12 +698,13 @@ smalltalk.method({
 selector: "reverseTrapAt:put:",
 fn: function (anObject,value){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1;
-$1=_st(anObject)._at_put_(self,value);
+return smalltalk.withContext(function($ctx1) { 
+var $1;
+$1=_st(anObject)._perform_withArguments_(_st(_st(_st(self)._first()).__comma(":"))._asSymbol(),[value]);
 return $1;
-}, function($ctx1) {$ctx1.fill(self,"reverseTrapAt:put:",{anObject:anObject,value:value}, smalltalk.String)})},
-messageSends: ["at:put:"]}),
-smalltalk.String);
+}, function($ctx1) {$ctx1.fill(self,"reverseTrapAt:put:",{anObject:anObject,value:value},smalltalk.Array)})},
+messageSends: ["perform:withArguments:", "asSymbol", ",", "first"]}),
+smalltalk.Array);
 
 smalltalk.addMethod(
 "_reverseTrapAt_",
@@ -640,20 +712,16 @@ smalltalk.method({
 selector: "reverseTrapAt:",
 fn: function (anObject){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1;
-var $early={};
-try {
-$1=_st((function(){
-return smalltalk.withContext(function($ctx2) {
return _st(anObject)._perform_(self);
-}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}))._on_do_((smalltalk.MessageNotUnderstood || MessageNotUnderstood),(function(){
-return smalltalk.withContext(function($ctx2) {
throw $early=[nil];
+return smalltalk.withContext(function($ctx1) { 
+var $1;
+$1=_st(anObject)._at_ifAbsent_(self,(function(){
+return smalltalk.withContext(function($ctx2) {
+return nil;
 }, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
 return $1;
-}
-catch(e) {if(e===$early)return e[0]; throw e}
-}, function($ctx1) {$ctx1.fill(self,"reverseTrapAt:",{anObject:anObject}, smalltalk.Symbol)})},
-messageSends: ["on:do:", "perform:"]}),
-smalltalk.Symbol);
+}, function($ctx1) {$ctx1.fill(self,"reverseTrapAt:",{anObject:anObject}, smalltalk.String)})},
+messageSends: ["at:ifAbsent:"]}),
+smalltalk.String);
 
 smalltalk.addMethod(
 "_reverseTrapAt_put_",
@@ -661,12 +729,13 @@ smalltalk.method({
 selector: "reverseTrapAt:put:",
 fn: function (anObject,value){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1;
-$1=_st(anObject)._perform_withArguments_(_st(_st(self).__comma(":"))._asSymbol(),[value]);
+return smalltalk.withContext(function($ctx1) { 
+var $1;
+$1=_st(anObject)._at_put_(self,value);
 return $1;
-}, function($ctx1) {$ctx1.fill(self,"reverseTrapAt:put:",{anObject:anObject,value:value}, smalltalk.Symbol)})},
-messageSends: ["perform:withArguments:", "asSymbol", ","]}),
-smalltalk.Symbol);
+}, function($ctx1) {$ctx1.fill(self,"reverseTrapAt:put:",{anObject:anObject,value:value}, smalltalk.String)})},
+messageSends: ["at:put:"]}),
+smalltalk.String);
 
 smalltalk.addMethod(
 "_reverseTrapAt_",
@@ -674,9 +743,11 @@ smalltalk.method({
 selector: "reverseTrapAt:",
 fn: function (anObject){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1;
+return smalltalk.withContext(function($ctx1) {
+var $1;
 $1=_st(anObject)._at_ifAbsent_(self,(function(){
-return smalltalk.withContext(function($ctx2) {
return nil;
+return smalltalk.withContext(function($ctx2) {
+return nil;
 }, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
 return $1;
 }, function($ctx1) {$ctx1.fill(self,"reverseTrapAt:",{anObject:anObject}, smalltalk.Number)})},
@@ -689,7 +760,8 @@ smalltalk.method({
 selector: "reverseTrapAt:put:",
 fn: function (anObject,value){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1;
+return smalltalk.withContext(function($ctx1) {
+var $1;
 $1=_st(anObject)._at_put_(self,value);
 return $1;
 }, function($ctx1) {$ctx1.fill(self,"reverseTrapAt:put:",{anObject:anObject,value:value}, smalltalk.Number)})},

+ 172 - 100
lib/js/Trapped-Backend.js

@@ -8,7 +8,8 @@ selector: "getBlock:",
 category: 'accessing',
 fn: function (aBlock){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
self["@getBlock"]=aBlock;
+return smalltalk.withContext(function($ctx1) { 
+self["@getBlock"]=aBlock;
 return self}, function($ctx1) {$ctx1.fill(self,"getBlock:",{aBlock:aBlock},smalltalk.EavModel)})},
 args: ["aBlock"],
 source: "getBlock: aBlock\x0a\x0agetBlock := aBlock",
@@ -24,12 +25,15 @@ selector: "initialize",
 category: 'initialization',
 fn: function (){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
smalltalk.Object.fn.prototype._initialize.apply(_st(self), []);
+return smalltalk.withContext(function($ctx1) { 
+smalltalk.Object.fn.prototype._initialize.apply(_st(self), []);
 self["@getBlock"]=(function(){
-return smalltalk.withContext(function($ctx2) {
return _st(self)._error_("No getter block.");
+return smalltalk.withContext(function($ctx2) {
+return _st(self)._error_("No getter block.");
 }, function($ctx2) {$ctx2.fillBlock({},$ctx1)})});
 self["@putBlock"]=(function(){
-return smalltalk.withContext(function($ctx2) {
return _st(self)._error_("No putter block.");
+return smalltalk.withContext(function($ctx2) {
+return _st(self)._error_("No putter block.");
 }, function($ctx2) {$ctx2.fillBlock({},$ctx1)})});
 return self}, function($ctx1) {$ctx1.fill(self,"initialize",{},smalltalk.EavModel)})},
 args: [],
@@ -46,7 +50,8 @@ selector: "on:",
 category: 'accessing',
 fn: function (anObject){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1;
+return smalltalk.withContext(function($ctx1) { 
+var $1;
 $1=_st(self["@getBlock"])._value_(anObject);
 return $1;
 }, function($ctx1) {$ctx1.fill(self,"on:",{anObject:anObject},smalltalk.EavModel)})},
@@ -64,7 +69,8 @@ selector: "on:put:",
 category: 'accessing',
 fn: function (anObject,anObject2){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1;
+return smalltalk.withContext(function($ctx1) { 
+var $1;
 $1=_st(self["@putBlock"])._value_value_(anObject,anObject2);
 return $1;
 }, function($ctx1) {$ctx1.fill(self,"on:put:",{anObject:anObject,anObject2:anObject2},smalltalk.EavModel)})},
@@ -82,7 +88,8 @@ selector: "putBlock:",
 category: 'accessing',
 fn: function (aBlock){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
self["@putBlock"]=aBlock;
+return smalltalk.withContext(function($ctx1) { 
+self["@putBlock"]=aBlock;
 return self}, function($ctx1) {$ctx1.fill(self,"putBlock:",{aBlock:aBlock},smalltalk.EavModel)})},
 args: ["aBlock"],
 source: "putBlock: aBlock\x0a\x0aputBlock := aBlock",
@@ -102,7 +109,8 @@ category: 'action',
 fn: function (anEavModel,aBlock){
 var self=this;
 var newValue;
-return smalltalk.withContext(function($ctx1) { 
newValue=_st(aBlock)._value_(_st(anEavModel)._on_(self));
+return smalltalk.withContext(function($ctx1) { 
+newValue=_st(aBlock)._value_(_st(anEavModel)._on_(self));
 _st(anEavModel)._on_put_(self,_st(newValue)._deepCopy());
 return self}, function($ctx1) {$ctx1.fill(self,"model:modify:",{anEavModel:anEavModel,aBlock:aBlock,newValue:newValue},smalltalk.Isolator)})},
 args: ["anEavModel", "aBlock"],
@@ -119,7 +127,8 @@ selector: "model:read:",
 category: 'action',
 fn: function (anEavModel,aBlock){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
_st(aBlock)._value_(_st(_st(anEavModel)._on_(self))._deepCopy());
+return smalltalk.withContext(function($ctx1) { 
+_st(aBlock)._value_(_st(_st(anEavModel)._on_(self))._deepCopy());
 return self}, function($ctx1) {$ctx1.fill(self,"model:read:",{anEavModel:anEavModel,aBlock:aBlock},smalltalk.Isolator)})},
 args: ["anEavModel", "aBlock"],
 source: "model: anEavModel read: aBlock\x0a\x0aaBlock value: (anEavModel on: self) deepCopy",
@@ -135,7 +144,8 @@ selector: "root",
 category: 'accessing',
 fn: function (){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1;
+return smalltalk.withContext(function($ctx1) { 
+var $1;
 $1=self["@root"];
 return $1;
 }, function($ctx1) {$ctx1.fill(self,"root",{},smalltalk.Isolator)})},
@@ -153,7 +163,8 @@ selector: "root:",
 category: 'accessing',
 fn: function (anObject){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
self["@root"]=anObject;
+return smalltalk.withContext(function($ctx1) { 
+self["@root"]=anObject;
 return self}, function($ctx1) {$ctx1.fill(self,"root:",{anObject:anObject},smalltalk.Isolator)})},
 args: ["anObject"],
 source: "root: anObject\x0a\x0aroot := anObject",
@@ -170,7 +181,8 @@ selector: "on:",
 category: 'instance creation',
 fn: function (anObject){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1;
+return smalltalk.withContext(function($ctx1) { 
+var $1;
 $1=_st(_st(self)._new())._root_(anObject);
 return $1;
 }, function($ctx1) {$ctx1.fill(self,"on:",{anObject:anObject},smalltalk.Isolator.klass)})},
@@ -192,10 +204,12 @@ category: 'action',
 fn: function (key){
 var self=this;
 var needsToRun;
-return smalltalk.withContext(function($ctx1) { 
var $1;
+return smalltalk.withContext(function($ctx1) { 
+var $1;
 needsToRun=false;
 _st(self)._do_((function(each){
-return smalltalk.withContext(function($ctx2) {
$1=_st(each)._accepts_(key);
+return smalltalk.withContext(function($ctx2) {
+$1=_st(each)._accepts_(key);
 if(smalltalk.assert($1)){
 _st(each)._flag();
 needsToRun=true;
@@ -218,11 +232,13 @@ selector: "dirty:",
 category: 'action',
 fn: function (aBoolean){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1;
+return smalltalk.withContext(function($ctx1) { 
+var $1;
 $1=aBoolean;
 if(smalltalk.assert($1)){
 _st((function(){
-return smalltalk.withContext(function($ctx2) {
return _st(self)._run();
+return smalltalk.withContext(function($ctx2) {
+return _st(self)._run();
 }, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}))._fork();
 };
 return self}, function($ctx1) {$ctx1.fill(self,"dirty:",{aBoolean:aBoolean},smalltalk.KeyedPubSubBase)})},
@@ -240,7 +256,8 @@ selector: "on:hook:",
 category: 'action',
 fn: function (key,aBlock){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
_st(self)._add_(_st(_st(self["@factory"])._value_value_(key,aBlock))._flag());
+return smalltalk.withContext(function($ctx1) { 
+_st(self)._add_(_st(_st(self["@factory"])._value_value_(key,aBlock))._flag());
 _st(self)._dirty_(true);
 return self}, function($ctx1) {$ctx1.fill(self,"on:hook:",{key:key,aBlock:aBlock},smalltalk.KeyedPubSubBase)})},
 args: ["key", "aBlock"],
@@ -258,10 +275,12 @@ category: 'action',
 fn: function (){
 var self=this;
 var needsClean;
-return smalltalk.withContext(function($ctx1) { 
var $1,$2,$3;
+return smalltalk.withContext(function($ctx1) { 
+var $1,$2,$3;
 needsClean=false;
 _st(self)._do_((function(each){
-return smalltalk.withContext(function($ctx2) {
$1=_st(each)._isFlagged();
+return smalltalk.withContext(function($ctx2) {
+$1=_st(each)._isFlagged();
 if(smalltalk.assert($1)){
 _st(each)._run();
 $2=_st(each)._isEnabled();
@@ -290,7 +309,8 @@ selector: "subscriptionFactory:",
 category: 'action',
 fn: function (aBlock){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
self["@factory"]=aBlock;
+return smalltalk.withContext(function($ctx1) { 
+self["@factory"]=aBlock;
 return self}, function($ctx1) {$ctx1.fill(self,"subscriptionFactory:",{aBlock:aBlock},smalltalk.KeyedPubSubBase)})},
 args: ["aBlock"],
 source: "subscriptionFactory: aBlock\x0a    factory := aBlock",
@@ -309,7 +329,8 @@ selector: "add:",
 category: 'accessing',
 fn: function (aSubscription){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
_st(self["@queue"])._add_(aSubscription);
+return smalltalk.withContext(function($ctx1) { 
+_st(self["@queue"])._add_(aSubscription);
 return self}, function($ctx1) {$ctx1.fill(self,"add:",{aSubscription:aSubscription},smalltalk.SimpleKeyedPubSub)})},
 args: ["aSubscription"],
 source: "add: aSubscription\x0a\x09queue add: aSubscription.\x0a",
@@ -325,8 +346,10 @@ selector: "clean",
 category: 'bookkeeping',
 fn: function (){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
self["@queue"]=_st(self["@queue"])._select_((function(each){
-return smalltalk.withContext(function($ctx2) {
return _st(each)._isEnabled();
+return smalltalk.withContext(function($ctx1) { 
+self["@queue"]=_st(self["@queue"])._select_((function(each){
+return smalltalk.withContext(function($ctx2) {
+return _st(each)._isEnabled();
 }, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1)})}));
 return self}, function($ctx1) {$ctx1.fill(self,"clean",{},smalltalk.SimpleKeyedPubSub)})},
 args: [],
@@ -343,7 +366,8 @@ selector: "do:",
 category: 'enumeration',
 fn: function (aBlock){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
_st(self["@queue"])._do_(aBlock);
+return smalltalk.withContext(function($ctx1) { 
+_st(self["@queue"])._do_(aBlock);
 return self}, function($ctx1) {$ctx1.fill(self,"do:",{aBlock:aBlock},smalltalk.SimpleKeyedPubSub)})},
 args: ["aBlock"],
 source: "do: aBlock\x0a\x09queue do: aBlock",
@@ -359,7 +383,8 @@ selector: "initialize",
 category: 'initialization',
 fn: function (){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
smalltalk.KeyedPubSubBase.fn.prototype._initialize.apply(_st(self), []);
+return smalltalk.withContext(function($ctx1) { 
+smalltalk.KeyedPubSubBase.fn.prototype._initialize.apply(_st(self), []);
 self["@queue"]=_st((smalltalk.OrderedCollection || OrderedCollection))._new();
 return self}, function($ctx1) {$ctx1.fill(self,"initialize",{},smalltalk.SimpleKeyedPubSub)})},
 args: [],
@@ -383,7 +408,8 @@ selector: "accepts:",
 category: 'testing',
 fn: function (aKey){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
_st(self)._subclassResponsibility();
+return smalltalk.withContext(function($ctx1) { 
+_st(self)._subclassResponsibility();
 return self}, function($ctx1) {$ctx1.fill(self,"accepts:",{aKey:aKey},smalltalk.KeyedSubscriptionBase)})},
 args: ["aKey"],
 source: "accepts: aKey\x0a    \x22Should return true if change for aKey is relevant for this subscription\x22\x0a    self subclassResponsibility",
@@ -399,7 +425,8 @@ selector: "flag",
 category: 'accessing',
 fn: function (){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
self["@flagged"]=true;
+return smalltalk.withContext(function($ctx1) { 
+self["@flagged"]=true;
 return self}, function($ctx1) {$ctx1.fill(self,"flag",{},smalltalk.KeyedSubscriptionBase)})},
 args: [],
 source: "flag\x0a\x09flagged := true",
@@ -415,7 +442,8 @@ selector: "initialize",
 category: 'initialization',
 fn: function (){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
smalltalk.Object.fn.prototype._initialize.apply(_st(self), []);
+return smalltalk.withContext(function($ctx1) { 
+smalltalk.Object.fn.prototype._initialize.apply(_st(self), []);
 self["@key"]=nil;
 self["@actionBlock"]=nil;
 self["@flagged"]=false;
@@ -434,7 +462,8 @@ selector: "isEnabled",
 category: 'testing',
 fn: function (){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1;
+return smalltalk.withContext(function($ctx1) { 
+var $1;
 $1=_st(self["@actionBlock"])._notNil();
 return $1;
 }, function($ctx1) {$ctx1.fill(self,"isEnabled",{},smalltalk.KeyedSubscriptionBase)})},
@@ -452,7 +481,8 @@ selector: "isFlagged",
 category: 'testing',
 fn: function (){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1;
+return smalltalk.withContext(function($ctx1) { 
+var $1;
 $1=self["@flagged"];
 return $1;
 }, function($ctx1) {$ctx1.fill(self,"isFlagged",{},smalltalk.KeyedSubscriptionBase)})},
@@ -470,7 +500,8 @@ selector: "key:block:",
 category: 'accessing',
 fn: function (anObject,aBlock){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
self["@key"]=anObject;
+return smalltalk.withContext(function($ctx1) { 
+self["@key"]=anObject;
 self["@actionBlock"]=aBlock;
 return self}, function($ctx1) {$ctx1.fill(self,"key:block:",{anObject:anObject,aBlock:aBlock},smalltalk.KeyedSubscriptionBase)})},
 args: ["anObject", "aBlock"],
@@ -487,15 +518,20 @@ selector: "run",
 category: 'action',
 fn: function (){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
_st((function(){
-return smalltalk.withContext(function($ctx2) {
return _st((function(){
-return smalltalk.withContext(function($ctx3) {
return _st(self["@actionBlock"])._value();
+return smalltalk.withContext(function($ctx1) { 
+_st((function(){
+return smalltalk.withContext(function($ctx2) {
+return _st((function(){
+return smalltalk.withContext(function($ctx3) {
+return _st(self["@actionBlock"])._value();
 }, function($ctx3) {$ctx3.fillBlock({},$ctx1)})}))._ensure_((function(){
-return smalltalk.withContext(function($ctx3) {
self["@flagged"]=false;
+return smalltalk.withContext(function($ctx3) {
+self["@flagged"]=false;
 return self["@flagged"];
 }, function($ctx3) {$ctx3.fillBlock({},$ctx1)})}));
 }, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}))._on_do_((smalltalk.KeyedPubSubUnsubscribe || KeyedPubSubUnsubscribe),(function(){
-return smalltalk.withContext(function($ctx2) {
self["@actionBlock"]=nil;
+return smalltalk.withContext(function($ctx2) {
+self["@actionBlock"]=nil;
 return self["@actionBlock"];
 }, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
 return self}, function($ctx1) {$ctx1.fill(self,"run",{},smalltalk.KeyedSubscriptionBase)})},
@@ -516,9 +552,11 @@ selector: "accepts:",
 category: 'testing',
 fn: function (aKey){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1;
+return smalltalk.withContext(function($ctx1) { 
+var $1;
 $1=_st(_st(_st(aKey)._size()).__lt_eq(_st(self["@key"])._size()))._and_((function(){
-return smalltalk.withContext(function($ctx2) {
return _st(aKey).__eq(_st(self["@key"])._copyFrom_to_((1),_st(aKey)._size()));
+return smalltalk.withContext(function($ctx2) {
+return _st(aKey).__eq(_st(self["@key"])._copyFrom_to_((1),_st(aKey)._size()));
 }, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
 return $1;
 }, function($ctx1) {$ctx1.fill(self,"accepts:",{aKey:aKey},smalltalk.ListKeyedSubscription)})},
@@ -540,7 +578,8 @@ selector: "dispatcher",
 category: 'accessing',
 fn: function (){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1;
+return smalltalk.withContext(function($ctx1) { 
+var $1;
 $1=self["@dispatcher"];
 return $1;
 }, function($ctx1) {$ctx1.fill(self,"dispatcher",{},smalltalk.ListKeyedEntity)})},
@@ -558,10 +597,12 @@ selector: "dispatcher:",
 category: 'accessing',
 fn: function (aDispatcher){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1,$2,$3,$4;
+return smalltalk.withContext(function($ctx1) { 
+var $1,$2,$3,$4;
 $1=aDispatcher;
 _st($1)._subscriptionFactory_((function(key,block){
-return smalltalk.withContext(function($ctx2) {
$2=_st((smalltalk.ListKeyedSubscription || ListKeyedSubscription))._new();
+return smalltalk.withContext(function($ctx2) {
+$2=_st((smalltalk.ListKeyedSubscription || ListKeyedSubscription))._new();
 _st($2)._key_block_(key,block);
 $3=_st($2)._yourself();
 return $3;
@@ -583,7 +624,8 @@ selector: "model:",
 category: 'accessing',
 fn: function (anObject){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
self["@payload"]=anObject;
+return smalltalk.withContext(function($ctx1) { 
+self["@payload"]=anObject;
 _st(_st(self)._dispatcher())._changed_([]);
 return self}, function($ctx1) {$ctx1.fill(self,"model:",{anObject:anObject},smalltalk.ListKeyedEntity)})},
 args: ["anObject"],
@@ -600,8 +642,10 @@ selector: "watch:do:",
 category: 'action',
 fn: function (path,aBlock){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
_st(_st(self)._dispatcher())._on_hook_(path,(function(){
-return smalltalk.withContext(function($ctx2) {
return _st(self)._read_do_(path,aBlock);
+return smalltalk.withContext(function($ctx1) { 
+_st(_st(self)._dispatcher())._on_hook_(path,(function(){
+return smalltalk.withContext(function($ctx2) {
+return _st(self)._read_do_(path,aBlock);
 }, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
 return self}, function($ctx1) {$ctx1.fill(self,"watch:do:",{path:path,aBlock:aBlock},smalltalk.ListKeyedEntity)})},
 args: ["path", "aBlock"],
@@ -623,12 +667,15 @@ category: 'action',
 fn: function (path,aBlock){
 var self=this;
 var newValue,eavModel;
-return smalltalk.withContext(function($ctx1) { 
eavModel=_st(path)._asEavModel();
+return smalltalk.withContext(function($ctx1) { 
+eavModel=_st(path)._asEavModel();
 newValue=_st(aBlock)._value_(_st(eavModel)._on_(self["@payload"]));
 _st((function(){
-return smalltalk.withContext(function($ctx2) {
return _st(eavModel)._on_put_(self["@payload"],newValue);
+return smalltalk.withContext(function($ctx2) {
+return _st(eavModel)._on_put_(self["@payload"],newValue);
 }, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}))._ensure_((function(){
-return smalltalk.withContext(function($ctx2) {
return _st(_st(self)._dispatcher())._changed_(path);
+return smalltalk.withContext(function($ctx2) {
+return _st(_st(self)._dispatcher())._changed_(path);
 }, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
 return self}, function($ctx1) {$ctx1.fill(self,"modify:do:",{path:path,aBlock:aBlock,newValue:newValue,eavModel:eavModel},smalltalk.ListKeyedDirectEntity)})},
 args: ["path", "aBlock"],
@@ -646,7 +693,8 @@ category: 'action',
 fn: function (path,aBlock){
 var self=this;
 var eavModel;
-return smalltalk.withContext(function($ctx1) { 
eavModel=_st(path)._asEavModel();
+return smalltalk.withContext(function($ctx1) { 
+eavModel=_st(path)._asEavModel();
 _st(aBlock)._value_(_st(eavModel)._on_(self["@payload"]));
 return self}, function($ctx1) {$ctx1.fill(self,"read:do:",{path:path,aBlock:aBlock,eavModel:eavModel},smalltalk.ListKeyedDirectEntity)})},
 args: ["path", "aBlock"],
@@ -667,7 +715,8 @@ selector: "model:",
 category: 'accessing',
 fn: function (anObject){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
smalltalk.ListKeyedEntity.fn.prototype._model_.apply(_st(self), [_st((smalltalk.Isolator || Isolator))._on_(anObject)]);
+return smalltalk.withContext(function($ctx1) { 
+smalltalk.ListKeyedEntity.fn.prototype._model_.apply(_st(self), [_st((smalltalk.Isolator || Isolator))._on_(anObject)]);
 return self}, function($ctx1) {$ctx1.fill(self,"model:",{anObject:anObject},smalltalk.ListKeyedIsolatedEntity)})},
 args: ["anObject"],
 source: "model: anObject\x0a\x09super model: (Isolator on: anObject)",
@@ -684,15 +733,18 @@ category: 'action',
 fn: function (path,aBlock){
 var self=this;
 var eavModel;
-return smalltalk.withContext(function($ctx1) { 
eavModel=_st(_st([smalltalk.symbolFor("root")]).__comma(path))._asEavModel();
+return smalltalk.withContext(function($ctx1) { 
+eavModel=_st(_st([["root"]]).__comma(path))._asEavModel();
 _st((function(){
-return smalltalk.withContext(function($ctx2) {
return _st(self["@payload"])._model_modify_(eavModel,aBlock);
+return smalltalk.withContext(function($ctx2) {
+return _st(self["@payload"])._model_modify_(eavModel,aBlock);
 }, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}))._ensure_((function(){
-return smalltalk.withContext(function($ctx2) {
return _st(_st(self)._dispatcher())._changed_(path);
+return smalltalk.withContext(function($ctx2) {
+return _st(_st(self)._dispatcher())._changed_(path);
 }, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
 return self}, function($ctx1) {$ctx1.fill(self,"modify:do:",{path:path,aBlock:aBlock,eavModel:eavModel},smalltalk.ListKeyedIsolatedEntity)})},
 args: ["path", "aBlock"],
-source: "modify: path do: aBlock\x0a    | eavModel |\x0a    eavModel := ({#root},path) asEavModel.\x0a    [ payload model: eavModel modify: aBlock ] ensure: [ self dispatcher changed: path ]\x0a",
+source: "modify: path do: aBlock\x0a    | eavModel |\x0a    eavModel := ({{#root}},path) asEavModel.\x0a    [ payload model: eavModel modify: aBlock ] ensure: [ self dispatcher changed: path ]",
 messageSends: ["asEavModel", ",", "ensure:", "changed:", "dispatcher", "model:modify:"],
 referencedClasses: []
 }),
@@ -706,11 +758,12 @@ category: 'action',
 fn: function (path,aBlock){
 var self=this;
 var eavModel;
-return smalltalk.withContext(function($ctx1) { 
eavModel=_st(_st([smalltalk.symbolFor("root")]).__comma(path))._asEavModel();
+return smalltalk.withContext(function($ctx1) { 
+eavModel=_st(_st([["root"]]).__comma(path))._asEavModel();
 _st(self["@payload"])._model_read_(eavModel,aBlock);
 return self}, function($ctx1) {$ctx1.fill(self,"read:do:",{path:path,aBlock:aBlock,eavModel:eavModel},smalltalk.ListKeyedIsolatedEntity)})},
 args: ["path", "aBlock"],
-source: "read: path do: aBlock\x0a    | eavModel |\x0a    eavModel := ({#root},path) asEavModel.\x0a    payload model: eavModel read: aBlock\x0a",
+source: "read: path do: aBlock\x0a    | eavModel |\x0a    eavModel := ({{#root}},path) asEavModel.\x0a    payload model: eavModel read: aBlock",
 messageSends: ["asEavModel", ",", "model:read:"],
 referencedClasses: []
 }),
@@ -725,7 +778,8 @@ selector: "reverseTrapAt:",
 category: '*Trapped-Backend',
 fn: function (anObject){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
return nil;
+return smalltalk.withContext(function($ctx1) { 
+return nil;
 }, function($ctx1) {$ctx1.fill(self,"reverseTrapAt:",{anObject:anObject}, smalltalk.Object)})},
 args: ["anObject"],
 source: "reverseTrapAt: anObject\x0a\x09^nil",
@@ -741,7 +795,8 @@ selector: "reverseTrapAt:put:",
 category: '*Trapped-Backend',
 fn: function (anObject,value){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
_st(self)._error_(_st(_st("Trapped cannot put at ").__comma(_st(_st(self)._class())._name())).__comma(" type key."));
+return smalltalk.withContext(function($ctx1) { 
+_st(self)._error_(_st(_st("Trapped cannot put at ").__comma(_st(_st(self)._class())._name())).__comma(" type key."));
 return self}, function($ctx1) {$ctx1.fill(self,"reverseTrapAt:put:",{anObject:anObject,value:value}, smalltalk.Object)})},
 args: ["anObject", "value"],
 source: "reverseTrapAt: anObject put: value\x0a\x09self error: 'Trapped cannot put at ', self class name, ' type key.'",
@@ -758,14 +813,17 @@ category: '*Trapped-Backend',
 fn: function (){
 var self=this;
 var model;
-return smalltalk.withContext(function($ctx1) { 
var $1,$3,$4,$6,$5,$2,$7,$9,$11,$12,$14,$13,$10,$8,$15;
+return smalltalk.withContext(function($ctx1) { 
+var $1,$3,$4,$6,$5,$2,$7,$9,$11,$12,$14,$13,$10,$8,$15;
 model=_st((smalltalk.EavModel || EavModel))._new();
 $1=model;
 $2=(function(anObject){
-return smalltalk.withContext(function($ctx2) {
$3=self;
+return smalltalk.withContext(function($ctx2) {
+$3=self;
 $4=anObject;
 $5=(function(soFar,segment){
-return smalltalk.withContext(function($ctx3) {
$6=soFar;
+return smalltalk.withContext(function($ctx3) {
+$6=soFar;
 if(($receiver = $6) == nil || $receiver == undefined){
 return $6;
 } else {
@@ -777,13 +835,16 @@ return _st($3)._inject_into_($4,$5);
 _st($1)._getBlock_($2);
 $7=_st(self)._isEmpty();
 $8=(function(){
-return smalltalk.withContext(function($ctx2) {
$9=model;
+return smalltalk.withContext(function($ctx2) {
+$9=model;
 $10=(function(anObject,value){
 var penultimate;
-return smalltalk.withContext(function($ctx3) {
$11=_st(self)._allButLast();
+return smalltalk.withContext(function($ctx3) {
+$11=_st(self)._allButLast();
 $12=anObject;
 $13=(function(soFar,segment){
-return smalltalk.withContext(function($ctx4) {
$14=soFar;
+return smalltalk.withContext(function($ctx4) {
+$14=soFar;
 if(($receiver = $14) == nil || $receiver == undefined){
 return $14;
 } else {
@@ -814,18 +875,28 @@ selector: "reverseTrapAt:",
 category: '*Trapped-Backend',
 fn: function (anObject){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1;
-$1=_st(anObject)._at_ifAbsent_(self,(function(){
-return smalltalk.withContext(function($ctx2) {
return nil;
+function $MessageNotUnderstood(){return smalltalk.MessageNotUnderstood||(typeof MessageNotUnderstood=="undefined"?nil:MessageNotUnderstood)}
+return smalltalk.withContext(function($ctx1) { 
+var $1;
+var $early={};
+try {
+$1=_st((function(){
+return smalltalk.withContext(function($ctx2) {
+return _st(anObject)._perform_(_st(self)._first());
+}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}))._on_do_($MessageNotUnderstood(),(function(){
+return smalltalk.withContext(function($ctx2) {
+throw $early=[nil];
 }, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
 return $1;
-}, function($ctx1) {$ctx1.fill(self,"reverseTrapAt:",{anObject:anObject}, smalltalk.String)})},
+}
+catch(e) {if(e===$early)return e[0]; throw e}
+}, function($ctx1) {$ctx1.fill(self,"reverseTrapAt:",{anObject:anObject},smalltalk.Array)})},
 args: ["anObject"],
-source: "reverseTrapAt: anObject\x0a\x09^anObject at: self ifAbsent: [nil]",
-messageSends: ["at:ifAbsent:"],
-referencedClasses: []
+source: "reverseTrapAt: anObject\x0a\x09^[anObject perform: self first] on: MessageNotUnderstood do: [^nil]",
+messageSends: ["on:do:", "perform:", "first"],
+referencedClasses: ["MessageNotUnderstood"]
 }),
-smalltalk.String);
+smalltalk.Array);
 
 smalltalk.addMethod(
 "_reverseTrapAt_put_",
@@ -834,16 +905,17 @@ selector: "reverseTrapAt:put:",
 category: '*Trapped-Backend',
 fn: function (anObject,value){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1;
-$1=_st(anObject)._at_put_(self,value);
+return smalltalk.withContext(function($ctx1) { 
+var $1;
+$1=_st(anObject)._perform_withArguments_(_st(_st(_st(self)._first()).__comma(":"))._asSymbol(),[value]);
 return $1;
-}, function($ctx1) {$ctx1.fill(self,"reverseTrapAt:put:",{anObject:anObject,value:value}, smalltalk.String)})},
+}, function($ctx1) {$ctx1.fill(self,"reverseTrapAt:put:",{anObject:anObject,value:value},smalltalk.Array)})},
 args: ["anObject", "value"],
-source: "reverseTrapAt: anObject put: value\x0a\x09^anObject at: self put: value",
-messageSends: ["at:put:"],
+source: "reverseTrapAt: anObject put: value\x0a    ^anObject perform: (self first, ':') asSymbol withArguments: { value }",
+messageSends: ["perform:withArguments:", "asSymbol", ",", "first"],
 referencedClasses: []
 }),
-smalltalk.String);
+smalltalk.Array);
 
 smalltalk.addMethod(
 "_reverseTrapAt_",
@@ -852,24 +924,20 @@ selector: "reverseTrapAt:",
 category: '*Trapped-Backend',
 fn: function (anObject){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1;
-var $early={};
-try {
-$1=_st((function(){
-return smalltalk.withContext(function($ctx2) {
return _st(anObject)._perform_(self);
-}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}))._on_do_((smalltalk.MessageNotUnderstood || MessageNotUnderstood),(function(){
-return smalltalk.withContext(function($ctx2) {
throw $early=[nil];
+return smalltalk.withContext(function($ctx1) { 
+var $1;
+$1=_st(anObject)._at_ifAbsent_(self,(function(){
+return smalltalk.withContext(function($ctx2) {
+return nil;
 }, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
 return $1;
-}
-catch(e) {if(e===$early)return e[0]; throw e}
-}, function($ctx1) {$ctx1.fill(self,"reverseTrapAt:",{anObject:anObject}, smalltalk.Symbol)})},
+}, function($ctx1) {$ctx1.fill(self,"reverseTrapAt:",{anObject:anObject}, smalltalk.String)})},
 args: ["anObject"],
-source: "reverseTrapAt: anObject\x0a\x09^[anObject perform: self] on: MessageNotUnderstood do: [^nil]",
-messageSends: ["on:do:", "perform:"],
-referencedClasses: ["MessageNotUnderstood"]
+source: "reverseTrapAt: anObject\x0a\x09^anObject at: self ifAbsent: [nil]",
+messageSends: ["at:ifAbsent:"],
+referencedClasses: []
 }),
-smalltalk.Symbol);
+smalltalk.String);
 
 smalltalk.addMethod(
 "_reverseTrapAt_put_",
@@ -878,16 +946,17 @@ selector: "reverseTrapAt:put:",
 category: '*Trapped-Backend',
 fn: function (anObject,value){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1;
-$1=_st(anObject)._perform_withArguments_(_st(_st(self).__comma(":"))._asSymbol(),[value]);
+return smalltalk.withContext(function($ctx1) { 
+var $1;
+$1=_st(anObject)._at_put_(self,value);
 return $1;
-}, function($ctx1) {$ctx1.fill(self,"reverseTrapAt:put:",{anObject:anObject,value:value}, smalltalk.Symbol)})},
+}, function($ctx1) {$ctx1.fill(self,"reverseTrapAt:put:",{anObject:anObject,value:value}, smalltalk.String)})},
 args: ["anObject", "value"],
-source: "reverseTrapAt: anObject put: value\x0a    ^anObject perform: (self, ':') asSymbol withArguments: { value }",
-messageSends: ["perform:withArguments:", "asSymbol", ","],
+source: "reverseTrapAt: anObject put: value\x0a\x09^anObject at: self put: value",
+messageSends: ["at:put:"],
 referencedClasses: []
 }),
-smalltalk.Symbol);
+smalltalk.String);
 
 smalltalk.addMethod(
 "_reverseTrapAt_",
@@ -896,9 +965,11 @@ selector: "reverseTrapAt:",
 category: '*Trapped-Backend',
 fn: function (anObject){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1;
+return smalltalk.withContext(function($ctx1) {
+var $1;
 $1=_st(anObject)._at_ifAbsent_(self,(function(){
-return smalltalk.withContext(function($ctx2) {
return nil;
+return smalltalk.withContext(function($ctx2) {
+return nil;
 }, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
 return $1;
 }, function($ctx1) {$ctx1.fill(self,"reverseTrapAt:",{anObject:anObject}, smalltalk.Number)})},
@@ -916,7 +987,8 @@ selector: "reverseTrapAt:put:",
 category: '*Trapped-Backend',
 fn: function (anObject,value){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1;
+return smalltalk.withContext(function($ctx1) {
+var $1;
 $1=_st(anObject)._at_put_(self,value);
 return $1;
 }, function($ctx1) {$ctx1.fill(self,"reverseTrapAt:put:",{anObject:anObject,value:value}, smalltalk.Number)})},

+ 39 - 21
lib/js/Trapped-Demo.deploy.js

@@ -6,12 +6,17 @@ smalltalk.method({
 selector: "initialize",
 fn: function (){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
smalltalk.ListKeyedIsolatedEntity.fn.prototype._initialize.apply(_st(self), []);
-_st(self)._dispatcher_(_st((smalltalk.SimpleKeyedPubSub || SimpleKeyedPubSub))._new());
-_st(self)._model_(_st(_st((smalltalk.AppModel || AppModel))._new())._title_("Todo"));
+function $SimpleKeyedPubSub(){return smalltalk.SimpleKeyedPubSub||(typeof SimpleKeyedPubSub=="undefined"?nil:SimpleKeyedPubSub)}
+function $AppModel(){return smalltalk.AppModel||(typeof AppModel=="undefined"?nil:AppModel)}
+return smalltalk.withContext(function($ctx1) { 
+smalltalk.ListKeyedIsolatedEntity.fn.prototype._initialize.apply(_st(self), []);
+_st(self)._dispatcher_(_st($SimpleKeyedPubSub())._new());
+_st(self)._model_(_st(_st($AppModel())._new())._title_("Todo"));
 _st((function(){
-return smalltalk.withContext(function($ctx2) {
return _st(self)._modify_do_([smalltalk.symbolFor("todos")],(function(){
-return smalltalk.withContext(function($ctx3) {
return [smalltalk.HashedCollection._fromPairs_([_st("text").__minus_gt("learn trapped"),_st("done").__minus_gt(true)]),smalltalk.HashedCollection._fromPairs_([_st("text").__minus_gt("build a trapped app"),_st("done").__minus_gt(false)])];
+return smalltalk.withContext(function($ctx2) {
+return _st(self)._modify_do_([["todos"]],(function(){
+return smalltalk.withContext(function($ctx3) {
+return [smalltalk.HashedCollection._fromPairs_([_st("text").__minus_gt("learn trapped"),_st("done").__minus_gt(true)]),smalltalk.HashedCollection._fromPairs_([_st("text").__minus_gt("build a trapped app"),_st("done").__minus_gt(false)])];
 }, function($ctx3) {$ctx3.fillBlock({},$ctx1)})}));
 }, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}))._valueWithTimeout_((2000));
 return self}, function($ctx1) {$ctx1.fill(self,"initialize",{},smalltalk.App)})},
@@ -153,20 +158,26 @@ smalltalk.method({
 selector: "renderOn:",
 fn: function (html){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1,$2,$3,$4,$5,$6,$7,$9,$10,$11,$12,$8;
+return smalltalk.withContext(function($ctx1) { 
+var $1,$2,$3,$4,$5,$6,$7,$9,$10,$11,$12,$8;
 _st([])._trapDescend_((function(snap){
-return smalltalk.withContext(function($ctx2) {
_st(_st(html)._h2())._trap_([smalltalk.symbolFor("title")]);
-return _st(_st(html)._div())._trap_toggle_ifNotPresent_([smalltalk.symbolFor("todos")],(function(){
-return smalltalk.withContext(function($ctx3) {
return _st(snap)._do_((function(){
-return smalltalk.withContext(function($ctx4) {
_st(_st(html)._span())._trap_([smalltalk.symbolFor("remaining")]);
+return smalltalk.withContext(function($ctx2) {
+_st(_st(html)._h2())._trap_([["title"]]);
+return _st(_st(html)._div())._trap_toggle_ifNotPresent_([["todos"]],(function(){
+return smalltalk.withContext(function($ctx3) {
+return _st(snap)._do_((function(){
+return smalltalk.withContext(function($ctx4) {
+_st(_st(html)._span())._trap_([["remaining"]]);
 _st(html)._with_(" of ");
-_st(_st(html)._span())._trap_([smalltalk.symbolFor("todos"), smalltalk.symbolFor("size")]);
+_st(_st(html)._span())._trap_([["todos"], ["size"]]);
 _st(html)._with_(" remaining [ ");
 $1=_st(html)._a();
 _st($1)._href_("");
 _st($1)._onClick_((function(){
-return smalltalk.withContext(function($ctx5) {
_st(snap)._modify_((function(model){
-return smalltalk.withContext(function($ctx6) {
return _st(model)._archive();
+return smalltalk.withContext(function($ctx5) {
+_st(snap)._modify_((function(model){
+return smalltalk.withContext(function($ctx6) {
+return _st(model)._archive();
 }, function($ctx6) {$ctx6.fillBlock({model:model},$ctx1)})}));
 return false;
 }, function($ctx5) {$ctx5.fillBlock({},$ctx1)})}));
@@ -174,15 +185,18 @@ $2=_st($1)._with_("archive");
 $2;
 _st(html)._with_(" ]");
 _st(_st(html)._ul())._with_((function(){
-return smalltalk.withContext(function($ctx5) {
return _st(html)._trapIter_tag_do_([smalltalk.symbolFor("todos")],smalltalk.symbolFor("li"),(function(each){
-return smalltalk.withContext(function($ctx6) {
_st(_st(html)._root())._empty();
+return smalltalk.withContext(function($ctx5) {
+return _st(html)._trapIter_tag_do_([["todos"]],"li",(function(each){
+return smalltalk.withContext(function($ctx6) {
+_st(_st(html)._root())._empty();
 $3=_st(html)._input();
 _st($3)._type_("checkbox");
 $4=_st($3)._trap_(["done"]);
 $4;
 $5=_st(html)._span();
 _st($5)._trap_read_(["done"],(function(model){
-return smalltalk.withContext(function($ctx7) {
return _st(_st(html)._root())._class_(_st("done-").__comma(model));
+return smalltalk.withContext(function($ctx7) {
+return _st(_st(html)._root())._class_(_st("done-").__comma(model));
 }, function($ctx7) {$ctx7.fillBlock({model:model},$ctx1)})}));
 $6=_st($5)._trap_(["text"]);
 return $6;
@@ -190,15 +204,18 @@ return $6;
 }, function($ctx5) {$ctx5.fillBlock({},$ctx1)})}));
 $7=_st(html)._form();
 _st($7)._onSubmit_((function(){
-return smalltalk.withContext(function($ctx5) {
_st(snap)._modify_((function(model){
-return smalltalk.withContext(function($ctx6) {
return _st(model)._addTodo();
+return smalltalk.withContext(function($ctx5) {
+_st(snap)._modify_((function(model){
+return smalltalk.withContext(function($ctx6) {
+return _st(model)._addTodo();
 }, function($ctx6) {$ctx6.fillBlock({model:model},$ctx1)})}));
 return false;
 }, function($ctx5) {$ctx5.fillBlock({},$ctx1)})}));
 $8=_st($7)._with_((function(){
-return smalltalk.withContext(function($ctx5) {
$9=_st(html)._input();
+return smalltalk.withContext(function($ctx5) {
+$9=_st(html)._input();
 _st($9)._type_("text");
-_st($9)._trap_([smalltalk.symbolFor("todoText")]);
+_st($9)._trap_([["todoText"]]);
 _st($9)._at_put_("size",(30));
 $10=_st($9)._placeholder_("add new todo here");
 $10;
@@ -211,7 +228,8 @@ return $12;
 return $8;
 }, function($ctx4) {$ctx4.fillBlock({},$ctx1)})}));
 }, function($ctx3) {$ctx3.fillBlock({},$ctx1)})}),(function(){
-return smalltalk.withContext(function($ctx3) {
return _st(html)._with_("Loading ...");
+return smalltalk.withContext(function($ctx3) {
+return _st(html)._with_("Loading ...");
 }, function($ctx3) {$ctx3.fillBlock({},$ctx1)})}));
 }, function($ctx2) {$ctx2.fillBlock({snap:snap},$ctx1)})}));
 return self}, function($ctx1) {$ctx1.fill(self,"renderOn:",{html:html},smalltalk.AppView)})},

+ 41 - 23
lib/js/Trapped-Demo.js

@@ -8,17 +8,22 @@ selector: "initialize",
 category: 'initialization',
 fn: function (){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
smalltalk.ListKeyedIsolatedEntity.fn.prototype._initialize.apply(_st(self), []);
-_st(self)._dispatcher_(_st((smalltalk.SimpleKeyedPubSub || SimpleKeyedPubSub))._new());
-_st(self)._model_(_st(_st((smalltalk.AppModel || AppModel))._new())._title_("Todo"));
+function $SimpleKeyedPubSub(){return smalltalk.SimpleKeyedPubSub||(typeof SimpleKeyedPubSub=="undefined"?nil:SimpleKeyedPubSub)}
+function $AppModel(){return smalltalk.AppModel||(typeof AppModel=="undefined"?nil:AppModel)}
+return smalltalk.withContext(function($ctx1) { 
+smalltalk.ListKeyedIsolatedEntity.fn.prototype._initialize.apply(_st(self), []);
+_st(self)._dispatcher_(_st($SimpleKeyedPubSub())._new());
+_st(self)._model_(_st(_st($AppModel())._new())._title_("Todo"));
 _st((function(){
-return smalltalk.withContext(function($ctx2) {
return _st(self)._modify_do_([smalltalk.symbolFor("todos")],(function(){
-return smalltalk.withContext(function($ctx3) {
return [smalltalk.HashedCollection._fromPairs_([_st("text").__minus_gt("learn trapped"),_st("done").__minus_gt(true)]),smalltalk.HashedCollection._fromPairs_([_st("text").__minus_gt("build a trapped app"),_st("done").__minus_gt(false)])];
+return smalltalk.withContext(function($ctx2) {
+return _st(self)._modify_do_([["todos"]],(function(){
+return smalltalk.withContext(function($ctx3) {
+return [smalltalk.HashedCollection._fromPairs_([_st("text").__minus_gt("learn trapped"),_st("done").__minus_gt(true)]),smalltalk.HashedCollection._fromPairs_([_st("text").__minus_gt("build a trapped app"),_st("done").__minus_gt(false)])];
 }, function($ctx3) {$ctx3.fillBlock({},$ctx1)})}));
 }, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}))._valueWithTimeout_((2000));
 return self}, function($ctx1) {$ctx1.fill(self,"initialize",{},smalltalk.App)})},
 args: [],
-source: "initialize\x0a\x09super initialize.\x0a    self dispatcher: SimpleKeyedPubSub new.\x0a    self model: (AppModel new title: 'Todo').\x0a    [ self modify: #(#todos) do: [{\x0a        #{'text'->'learn trapped'. 'done'->true}.\x0a        #{'text'->'build a trapped app'. 'done'->false}\x0a    }]] valueWithTimeout: 2000\x0a",
+source: "initialize\x0a\x09super initialize.\x0a    self dispatcher: SimpleKeyedPubSub new.\x0a    self model: (AppModel new title: 'Todo').\x0a    [ self modify: #((todos)) do: [{\x0a        #{'text'->'learn trapped'. 'done'->true}.\x0a        #{'text'->'build a trapped app'. 'done'->false}\x0a    }]] valueWithTimeout: 2000",
 messageSends: ["initialize", "dispatcher:", "new", "model:", "title:", "valueWithTimeout:", "modify:do:", "->"],
 referencedClasses: ["SimpleKeyedPubSub", "AppModel"]
 }),
@@ -212,20 +217,26 @@ selector: "renderOn:",
 category: 'rendering',
 fn: function (html){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1,$2,$3,$4,$5,$6,$7,$9,$10,$11,$12,$8;
+return smalltalk.withContext(function($ctx1) { 
+var $1,$2,$3,$4,$5,$6,$7,$9,$10,$11,$12,$8;
 _st([])._trapDescend_((function(snap){
-return smalltalk.withContext(function($ctx2) {
_st(_st(html)._h2())._trap_([smalltalk.symbolFor("title")]);
-return _st(_st(html)._div())._trap_toggle_ifNotPresent_([smalltalk.symbolFor("todos")],(function(){
-return smalltalk.withContext(function($ctx3) {
return _st(snap)._do_((function(){
-return smalltalk.withContext(function($ctx4) {
_st(_st(html)._span())._trap_([smalltalk.symbolFor("remaining")]);
+return smalltalk.withContext(function($ctx2) {
+_st(_st(html)._h2())._trap_([["title"]]);
+return _st(_st(html)._div())._trap_toggle_ifNotPresent_([["todos"]],(function(){
+return smalltalk.withContext(function($ctx3) {
+return _st(snap)._do_((function(){
+return smalltalk.withContext(function($ctx4) {
+_st(_st(html)._span())._trap_([["remaining"]]);
 _st(html)._with_(" of ");
-_st(_st(html)._span())._trap_([smalltalk.symbolFor("todos"), smalltalk.symbolFor("size")]);
+_st(_st(html)._span())._trap_([["todos"], ["size"]]);
 _st(html)._with_(" remaining [ ");
 $1=_st(html)._a();
 _st($1)._href_("");
 _st($1)._onClick_((function(){
-return smalltalk.withContext(function($ctx5) {
_st(snap)._modify_((function(model){
-return smalltalk.withContext(function($ctx6) {
return _st(model)._archive();
+return smalltalk.withContext(function($ctx5) {
+_st(snap)._modify_((function(model){
+return smalltalk.withContext(function($ctx6) {
+return _st(model)._archive();
 }, function($ctx6) {$ctx6.fillBlock({model:model},$ctx1)})}));
 return false;
 }, function($ctx5) {$ctx5.fillBlock({},$ctx1)})}));
@@ -233,15 +244,18 @@ $2=_st($1)._with_("archive");
 $2;
 _st(html)._with_(" ]");
 _st(_st(html)._ul())._with_((function(){
-return smalltalk.withContext(function($ctx5) {
return _st(html)._trapIter_tag_do_([smalltalk.symbolFor("todos")],smalltalk.symbolFor("li"),(function(each){
-return smalltalk.withContext(function($ctx6) {
_st(_st(html)._root())._empty();
+return smalltalk.withContext(function($ctx5) {
+return _st(html)._trapIter_tag_do_([["todos"]],"li",(function(each){
+return smalltalk.withContext(function($ctx6) {
+_st(_st(html)._root())._empty();
 $3=_st(html)._input();
 _st($3)._type_("checkbox");
 $4=_st($3)._trap_(["done"]);
 $4;
 $5=_st(html)._span();
 _st($5)._trap_read_(["done"],(function(model){
-return smalltalk.withContext(function($ctx7) {
return _st(_st(html)._root())._class_(_st("done-").__comma(model));
+return smalltalk.withContext(function($ctx7) {
+return _st(_st(html)._root())._class_(_st("done-").__comma(model));
 }, function($ctx7) {$ctx7.fillBlock({model:model},$ctx1)})}));
 $6=_st($5)._trap_(["text"]);
 return $6;
@@ -249,15 +263,18 @@ return $6;
 }, function($ctx5) {$ctx5.fillBlock({},$ctx1)})}));
 $7=_st(html)._form();
 _st($7)._onSubmit_((function(){
-return smalltalk.withContext(function($ctx5) {
_st(snap)._modify_((function(model){
-return smalltalk.withContext(function($ctx6) {
return _st(model)._addTodo();
+return smalltalk.withContext(function($ctx5) {
+_st(snap)._modify_((function(model){
+return smalltalk.withContext(function($ctx6) {
+return _st(model)._addTodo();
 }, function($ctx6) {$ctx6.fillBlock({model:model},$ctx1)})}));
 return false;
 }, function($ctx5) {$ctx5.fillBlock({},$ctx1)})}));
 $8=_st($7)._with_((function(){
-return smalltalk.withContext(function($ctx5) {
$9=_st(html)._input();
+return smalltalk.withContext(function($ctx5) {
+$9=_st(html)._input();
 _st($9)._type_("text");
-_st($9)._trap_([smalltalk.symbolFor("todoText")]);
+_st($9)._trap_([["todoText"]]);
 _st($9)._at_put_("size",(30));
 $10=_st($9)._placeholder_("add new todo here");
 $10;
@@ -270,12 +287,13 @@ return $12;
 return $8;
 }, function($ctx4) {$ctx4.fillBlock({},$ctx1)})}));
 }, function($ctx3) {$ctx3.fillBlock({},$ctx1)})}),(function(){
-return smalltalk.withContext(function($ctx3) {
return _st(html)._with_("Loading ...");
+return smalltalk.withContext(function($ctx3) {
+return _st(html)._with_("Loading ...");
 }, function($ctx3) {$ctx3.fillBlock({},$ctx1)})}));
 }, function($ctx2) {$ctx2.fillBlock({snap:snap},$ctx1)})}));
 return self}, function($ctx1) {$ctx1.fill(self,"renderOn:",{html:html},smalltalk.AppView)})},
 args: ["html"],
-source: "renderOn: html\x0a    #() trapDescend: [ :snap |\x0a\x09html h2 trap: #(#title).\x0a    html div trap: #(#todos) toggle: [ snap do: [\x0a        html span trap:#(#remaining).\x0a        html with: ' of '.\x0a        html span trap: #(#todos #size).\x0a        html with: ' remaining [ '.\x0a        html a href:''; onClick: [\x0a            snap modify: [ :model | model archive ].\x0a            false\x0a        ]; with: 'archive'.\x0a        html with: ' ]'.\x0a        html ul with: [ html trapIter: #(#todos) tag: #li do: [ :each |\x0a            html root empty.\x0a            html input type: 'checkbox'; trap: #('done').\x0a            html span trap: #('done') read: [ :model | html root class: 'done-', model ]; trap: #('text').\x0a        ]].\x0a        html form onSubmit: [\x0a            snap modify: [ :model | model addTodo ].\x0a            false\x0a        ]; with: [\x0a            html input type: 'text'; trap: #(#todoText); at: 'size' put: 30; placeholder: 'add new todo here'.\x0a            html input class: 'btn-primary'; type: 'submit'; value: 'add'.\x0a        ].\x0a    ]] ifNotPresent: [ html with: 'Loading ...' ]]",
+source: "renderOn: html\x0a    #() trapDescend: [ :snap |\x0a\x09html h2 trap: #((title)).\x0a    html div trap: #((todos)) toggle: [ snap do: [\x0a        html span trap:#((remaining)).\x0a        html with: ' of '.\x0a        html span trap: #((todos) (size)).\x0a        html with: ' remaining [ '.\x0a        html a href:''; onClick: [\x0a            snap modify: [ :model | model archive ].\x0a            false\x0a        ]; with: 'archive'.\x0a        html with: ' ]'.\x0a        html ul with: [ html trapIter: #((todos)) tag: #li do: [ :each |\x0a            html root empty.\x0a            html input type: 'checkbox'; trap: #('done').\x0a            html span trap: #('done') read: [ :model | html root class: 'done-', model ]; trap: #('text').\x0a        ]].\x0a        html form onSubmit: [\x0a            snap modify: [ :model | model addTodo ].\x0a            false\x0a        ]; with: [\x0a            html input type: 'text'; trap: #((todoText)); at: 'size' put: 30; placeholder: 'add new todo here'.\x0a            html input class: 'btn-primary'; type: 'submit'; value: 'add'.\x0a        ].\x0a    ]] ifNotPresent: [ html with: 'Loading ...' ]]",
 messageSends: ["trapDescend:", "trap:", "h2", "trap:toggle:ifNotPresent:", "do:", "span", "with:", "href:", "a", "onClick:", "modify:", "archive", "trapIter:tag:do:", "empty", "root", "type:", "input", "trap:read:", "class:", ",", "ul", "onSubmit:", "addTodo", "form", "at:put:", "placeholder:", "value:", "div"],
 referencedClasses: []
 }),

+ 6 - 4
lib/js/Trapped-Frontend.deploy.js

@@ -398,10 +398,12 @@ smalltalk.method({
 selector: "parse:",
 fn: function (anArray){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $2,$3,$1;
+return smalltalk.withContext(function($ctx1) { 
+var $2,$3,$1;
 $1=_st(anArray)._collect_((function(each){
 var asNum;
-return smalltalk.withContext(function($ctx2) {
asNum=_st(each)._asNumber();
+return smalltalk.withContext(function($ctx2) {
+asNum=_st(each)._asNumber();
 asNum;
 $2=_st(asNum).__eq(asNum);
 if(smalltalk.assert($2)){
@@ -409,7 +411,7 @@ return asNum;
 } else {
 $3=_st(_st(each)._first()).__eq("#");
 if(smalltalk.assert($3)){
-return _st(_st(each)._allButFirst())._asSymbol();
+return [_st(each)._allButFirst()];
 } else {
 return each;
 };
@@ -417,7 +419,7 @@ return each;
 }, function($ctx2) {$ctx2.fillBlock({each:each,asNum:asNum},$ctx1)})}));
 return $1;
 }, function($ctx1) {$ctx1.fill(self,"parse:",{anArray:anArray},smalltalk.Trapped.klass)})},
-messageSends: ["collect:", "asNumber", "ifTrue:ifFalse:", "asSymbol", "allButFirst", "=", "first"]}),
+messageSends: ["collect:", "asNumber", "ifTrue:ifFalse:", "allButFirst", "=", "first"]}),
 smalltalk.Trapped.klass);
 
 

+ 7 - 5
lib/js/Trapped-Frontend.js

@@ -505,10 +505,12 @@ selector: "parse:",
 category: 'accessing',
 fn: function (anArray){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $2,$3,$1;
+return smalltalk.withContext(function($ctx1) { 
+var $2,$3,$1;
 $1=_st(anArray)._collect_((function(each){
 var asNum;
-return smalltalk.withContext(function($ctx2) {
asNum=_st(each)._asNumber();
+return smalltalk.withContext(function($ctx2) {
+asNum=_st(each)._asNumber();
 asNum;
 $2=_st(asNum).__eq(asNum);
 if(smalltalk.assert($2)){
@@ -516,7 +518,7 @@ return asNum;
 } else {
 $3=_st(_st(each)._first()).__eq("#");
 if(smalltalk.assert($3)){
-return _st(_st(each)._allButFirst())._asSymbol();
+return [_st(each)._allButFirst()];
 } else {
 return each;
 };
@@ -525,8 +527,8 @@ return each;
 return $1;
 }, function($ctx1) {$ctx1.fill(self,"parse:",{anArray:anArray},smalltalk.Trapped.klass)})},
 args: ["anArray"],
-source: "parse: anArray\x0a\x09^anArray collect: [ :each |\x0a    \x09| asNum |\x0a       \x09asNum := each asNumber.\x0a        asNum = asNum ifTrue: [ asNum ] ifFalse: [\x0a\x09\x09\x09each first = '#' ifTrue: [ each allButFirst asSymbol ] ifFalse: [ each ]]]",
-messageSends: ["collect:", "asNumber", "ifTrue:ifFalse:", "asSymbol", "allButFirst", "=", "first"],
+source: "parse: anArray\x0a\x09^anArray collect: [ :each |\x0a    \x09| asNum |\x0a       \x09asNum := each asNumber.\x0a        asNum = asNum ifTrue: [ asNum ] ifFalse: [\x0a\x09\x09\x09each first = '#' ifTrue: [ { each allButFirst } ] ifFalse: [ each ]]]",
+messageSends: ["collect:", "asNumber", "ifTrue:ifFalse:", "allButFirst", "=", "first"],
 referencedClasses: []
 }),
 smalltalk.Trapped.klass);

+ 8 - 8
lib/st/Trapped-Backend.st

@@ -300,13 +300,13 @@ model: anObject
 
 modify: path do: aBlock
     | eavModel |
-    eavModel := ({#root},path) asEavModel.
+    eavModel := ({{#root}},path) asEavModel.
     [ payload model: eavModel modify: aBlock ] ensure: [ self dispatcher changed: path ]
 !
 
 read: path do: aBlock
     | eavModel |
-    eavModel := ({#root},path) asEavModel.
+    eavModel := ({{#root}},path) asEavModel.
     payload model: eavModel read: aBlock
 ! !
 
@@ -336,24 +336,24 @@ asEavModel
     ^model
 ! !
 
-!String methodsFor: '*Trapped-Backend'!
+!Array methodsFor: '*Trapped-Backend'!
 
 reverseTrapAt: anObject
-	^anObject at: self ifAbsent: [nil]
+	^[anObject perform: self first] on: MessageNotUnderstood do: [^nil]
 !
 
 reverseTrapAt: anObject put: value
-	^anObject at: self put: value
+    ^anObject perform: (self first, ':') asSymbol withArguments: { value }
 ! !
 
-!Symbol methodsFor: '*Trapped-Backend'!
+!String methodsFor: '*Trapped-Backend'!
 
 reverseTrapAt: anObject
-	^[anObject perform: self] on: MessageNotUnderstood do: [^nil]
+	^anObject at: self ifAbsent: [nil]
 !
 
 reverseTrapAt: anObject put: value
-    ^anObject perform: (self, ':') asSymbol withArguments: { value }
+	^anObject at: self put: value
 ! !
 
 !Number methodsFor: '*Trapped-Backend'!

+ 7 - 7
lib/st/Trapped-Demo.st

@@ -37,7 +37,7 @@ initialize
 	super initialize.
     self dispatcher: SimpleKeyedPubSub new.
     self model: (AppModel new title: 'Todo').
-    [ self modify: #(#todos) do: [{
+    [ self modify: #((todos)) do: [{
         #{'text'->'learn trapped'. 'done'->true}.
         #{'text'->'build a trapped app'. 'done'->false}
     }]] valueWithTimeout: 2000
@@ -148,18 +148,18 @@ Widget subclass: #AppView
 
 renderOn: html
     #() trapDescend: [ :snap |
-	html h2 trap: #(#title).
-    html div trap: #(#todos) toggle: [ snap do: [
-        html span trap:#(#remaining).
+	html h2 trap: #((title)).
+    html div trap: #((todos)) toggle: [ snap do: [
+        html span trap:#((remaining)).
         html with: ' of '.
-        html span trap: #(#todos #size).
+        html span trap: #((todos) (size)).
         html with: ' remaining [ '.
         html a href:''; onClick: [
             snap modify: [ :model | model archive ].
             false
         ]; with: 'archive'.
         html with: ' ]'.
-        html ul with: [ html trapIter: #(#todos) tag: #li do: [ :each |
+        html ul with: [ html trapIter: #((todos)) tag: #li do: [ :each |
             html root empty.
             html input type: 'checkbox'; trap: #('done').
             html span trap: #('done') read: [ :model | html root class: 'done-', model ]; trap: #('text').
@@ -168,7 +168,7 @@ renderOn: html
             snap modify: [ :model | model addTodo ].
             false
         ]; with: [
-            html input type: 'text'; trap: #(#todoText); at: 'size' put: 30; placeholder: 'add new todo here'.
+            html input type: 'text'; trap: #((todoText)); at: 'size' put: 30; placeholder: 'add new todo here'.
             html input class: 'btn-primary'; type: 'submit'; value: 'add'.
         ].
     ]] ifNotPresent: [ html with: 'Loading ...' ]]

+ 1 - 1
lib/st/Trapped-Frontend.st

@@ -176,7 +176,7 @@ parse: anArray
     	| asNum |
        	asNum := each asNumber.
         asNum = asNum ifTrue: [ asNum ] ifFalse: [
-			each first = '#' ifTrue: [ each allButFirst asSymbol ] ifFalse: [ each ]]]
+			each first = '#' ifTrue: [ { each allButFirst } ] ifFalse: [ each ]]]
 ! !
 
 !Trapped class methodsFor: 'private'!

+ 1 - 1
vendor/amber

@@ -1 +1 @@
-Subproject commit aea58c4cb9a5af8f8cf793ab730a08e64693c4ab
+Subproject commit ea33b05f3f5a3e8dbec93da0a4d0f9d3c04cf602