Loading [MathJax]/jax/output/HTML-CSS/jax.js

In this R Markdown notebook I draw some figures illustrating the basic ideas in the monocentric city model (Alonso-Muth-Mills model). To keep things simple, I use a model without a housing construction industry and where consumers just consume land directly. The city is a line and the amount of land at every point is equal to 1.

Assumptions and Functional Forms

Consumers have Cobb-Douglas utility over land l and a numeraire good z.

U(l,z)=lαz1α

For a consumer living at distance x from the center, the budget constraint is: y=z+r(x)l(x)τx The city is closed, with population N, and agricultural land rent rA.

Solving the Model

In equilibrium all consumers have the same (endogenous) utility, ˉu, and the land rent at the fringe of the city is equal to the agricultural rent, r(ˉx)=rA. Further, there is one unit of land at every location, L(x)=1 for x=0 to x=ˉx, and everyone is housed between the center of the city and the fringe.

From Cobb-Douglas demand we know that z(x)=(1α)(yτx) and l(x)=α(yτx)r(x). Substituting these into the spatial equilibrium condition (equal utility) gives:

U(l,z)=[α(yτx)r(x)]α[(1α)(yτx)]1α=ˉu We can rewrite this equation to express land rent at x as a function of y, τ, ˉu, and α. r(x)=(yτxˉu)1αα(1α)1αα The Alonso-Muth condition tells us the gradient of the land rent, which we could also derive by taking the derivative of the above equation: dr(x)dx=τ((1α)(yτx))1ααˉu1α=τl(x) There are 1/l(x) people living at every location x. Combining the Alonso-Muth condition with the requirement that everyone is housed in the city implies that: ˉxx=01l(x)dx=1τˉxx=0dr(x)dxdx=r(ˉx)r(0)τ=N Using r(ˉx)=rA gives r(0)=τN+r(ˉx). We can then find the utility of a consumer at the center by inserting this expression for r(0) into the indirect utility function (eq 3), thus giving us ˉu. Finally, with ˉu we can solve for ˉx by the land rent equation (eq 4) equal to rA.

Solving for equilibrium

First, let’s set the exogenous parameters: α, y, τ, rA, and N.

alpha<-0.5
y<-100
tau<-1
r.A<-50
N<-1000

Next, let’s write functions for the indirect utility and land rent, so that we can solve for the equilibrium values of ˉu and ˉx.

V<-function(x,r.x,alpha,y,tau){
  l.x<-alpha*(y-tau*x)/r.x #demand for land
  z.x<-(1-alpha)*(y-tau*x) #demand for numeraire
  l.x^alpha*z.x^(1-alpha) #returns the utility at x
}
R<-function(x,alpha,y,tau,u.bar) {
  inner<-(y-tau*x)/u.bar
  const<-alpha*(1-alpha)^((1-alpha)/alpha)
  inner^(1/alpha)*const #returns the rent at x
}

Now let’s solve for the equilibrium values. To find the fringe we will look for the value ˉx such that R(ˉx)rA=0.

r.0<-r.A+tau*N
u.bar<-V(0,r.0,alpha,y,tau)
#Define a function so that we can find x.bar
find.xbar<-function(x,alpha,y,tau,r.A,u.bar) {
  R(x,alpha,y,tau,u.bar)-r.A
}
x.bar<-as.numeric(uniroot(find.xbar,lower=0,upper=y/tau,alpha=alpha,y=y,tau=tau,r.A=r.A,u.bar=u.bar)[1])

The equilibrium values are ˉu=1.5430335 and ˉx=78.178211. Is this correct? Let’s check if integrating the population at each location is equal to the total, N.

l.demand<-function(x,alpha,y,tau,r.x) { #demand for land
  alpha*(y-tau*x)/r.x
}
pop<-function(x,alpha,y,tau,u.bar) {
  r.x<-R(x,alpha,y,tau,u.bar)
  1/l.demand(x,alpha,y,tau,r.x)
}
N.check<-integrate(pop,lower=0,upper=x.bar,alpha=alpha,y=y,tau=tau,u.bar=u.bar) #this should be equal to N

Integrating the population over the city yields a total population of N.check=1000

Graphing

First, let’s graph the equilibrium rent curve

curve(R(x,alpha,y,tau,u.bar),from=0,to=x.bar,xlab="Distance from center (x)",ylab="Land rent, r(x)",main="Land rent over the city")

Next we can look at land consumption:

curve(l.demand(x,alpha,y,tau,R(x,alpha,y,tau,u.bar)),from=0,to=x.bar,xlab="Distance from center (x)",ylab="Land consumption, l(x)",main="Land consumption over the city")

Comparative Statics

Now let’s look at some comparative statics.

y.1<-500
tau.1<-0.7
r.A.1<-100
N.1<-5000

How does a change in the transporation cost τ from τ0=1 to τ1=0.7 affect land consumption at every point?

r.0.1<-r.A+tau.1*N
u.bar.1<-V(0,r.0.1,alpha,y,tau.1)
x.bar.1<-as.numeric(uniroot(find.xbar,lower=0,upper=y/tau.1,alpha=alpha,y=y,tau=tau.1,r.A=r.A,u.bar=u.bar.1)[1])

curve(R(x,alpha,y,tau.1,u.bar.1),from=0,to=x.bar.1,xlab="Distance from center (x)",ylab="Land rent, r(x)",main="Land rent over the city",col="red",ylim=c(0,max(r.0,r.0.1)),xlim=c(0,max(x.bar,x.bar.1)))
curve(R(x,alpha,y,tau,u.bar),from=0,to=x.bar,add=TRUE,col="black")
text(x.bar,l.demand(x.bar,alpha,y,tau,r.A),"tau.0")
text(x.bar.1,l.demand(x.bar.1,alpha,y,tau.1,r.A),"tau.1",col="red")


curve(l.demand(x,alpha,y,tau.1,R(x,alpha,y,tau.1,u.bar.1)),from=0,to=x.bar.1,xlab="Distance from center (x)",ylab="Land consumption, l(x)",main="Land consumption over the city",col="red",ylim=c(0,0.3),xlim=c(0,max(x.bar,x.bar.1)))
curve(l.demand(x,alpha,y,tau,R(x,alpha,y,tau,u.bar)),from=0,to=x.bar,add=TRUE,col="black")
text(x.bar,l.demand(x.bar,alpha,y,tau,r.A),"tau.0")
text(x.bar.1,l.demand(x.bar.1,alpha,y,tau.1,r.A),"tau.1",col="red")

R Notebook Instructions

Add a new chunk by clicking the Insert Chunk button on the toolbar or by pressing Ctrl+Alt+I.

When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the Preview button or press Ctrl+Shift+K to preview the HTML file).

The preview shows you a rendered HTML copy of the contents of the editor. Consequently, unlike Knit, Preview does not run any R code chunks. Instead, the output of the chunk when it was last run in the editor is displayed.

LS0tDQp0aXRsZTogIlNpbXBsZSBNb25vY2VudHJpYyBDaXR5OiBObyBIb3VzaW5nLCBMYW5kIGluIFV0aWxpdHkgRnVuY3Rpb24iDQpoZWFkZXItaW5jbHVkZXM6IFx1c2VwYWNrYWdle2Ftc21hdGh9DQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpJbiB0aGlzIFtSIE1hcmtkb3duXShodHRwOi8vcm1hcmtkb3duLnJzdHVkaW8uY29tKSBub3RlYm9vayBJIGRyYXcgc29tZSBmaWd1cmVzIGlsbHVzdHJhdGluZyB0aGUgYmFzaWMgaWRlYXMgaW4gdGhlIG1vbm9jZW50cmljIGNpdHkgbW9kZWwgKEFsb25zby1NdXRoLU1pbGxzIG1vZGVsKS4gVG8ga2VlcCB0aGluZ3Mgc2ltcGxlLCBJIHVzZSBhIG1vZGVsIHdpdGhvdXQgYSBob3VzaW5nIGNvbnN0cnVjdGlvbiBpbmR1c3RyeSBhbmQgd2hlcmUgY29uc3VtZXJzIGp1c3QgY29uc3VtZSBsYW5kIGRpcmVjdGx5LiBUaGUgY2l0eSBpcyBhIGxpbmUgYW5kIHRoZSBhbW91bnQgb2YgbGFuZCBhdCBldmVyeSBwb2ludCBpcyBlcXVhbCB0byAxLg0KDQojIyBBc3N1bXB0aW9ucyBhbmQgRnVuY3Rpb25hbCBGb3Jtcw0KQ29uc3VtZXJzIGhhdmUgQ29iYi1Eb3VnbGFzIHV0aWxpdHkgb3ZlciAqbGFuZCogJGwkIGFuZCBhIG51bWVyYWlyZSBnb29kICR6JC4gDQoNCiQkVShsLHopPWxee1xhbHBoYX16XnsxLVxhbHBoYX1cdGFnezF9JCQNCg0KRm9yIGEgY29uc3VtZXIgbGl2aW5nIGF0IGRpc3RhbmNlICR4JCBmcm9tIHRoZSBjZW50ZXIsIHRoZSBidWRnZXQgY29uc3RyYWludCBpczoNCiQkeT16K3IoeClsKHgpLVx0YXUqeFx0YWd7Mn0kJA0KVGhlIGNpdHkgaXMgY2xvc2VkLCB3aXRoIHBvcHVsYXRpb24gJE4kLCBhbmQgIGFncmljdWx0dXJhbCBsYW5kIHJlbnQgJHJfQSQuDQoNCiMjIFNvbHZpbmcgdGhlIE1vZGVsDQpJbiBlcXVpbGlicml1bSBhbGwgY29uc3VtZXJzIGhhdmUgdGhlIHNhbWUgKGVuZG9nZW5vdXMpIHV0aWxpdHksICRcYmFye3V9JCwgYW5kIHRoZSBsYW5kIHJlbnQgYXQgdGhlIGZyaW5nZSBvZiB0aGUgY2l0eSBpcyBlcXVhbCB0byB0aGUgYWdyaWN1bHR1cmFsIHJlbnQsICRyKFxiYXJ7eH0pPXJfQSQuIEZ1cnRoZXIsIHRoZXJlIGlzIG9uZSB1bml0IG9mIGxhbmQgYXQgZXZlcnkgbG9jYXRpb24sICRMKHgpPTEkIGZvciAkeD0wJCB0byAkeD1cYmFye3h9JCwgYW5kIGV2ZXJ5b25lIGlzIGhvdXNlZCBiZXR3ZWVuIHRoZSBjZW50ZXIgb2YgdGhlIGNpdHkgYW5kIHRoZSBmcmluZ2UuDQoNCkZyb20gQ29iYi1Eb3VnbGFzIGRlbWFuZCB3ZSBrbm93IHRoYXQgJHooeCk9KDEtXGFscGhhKSh5LVx0YXUqeCkkIGFuZCAkbCh4KT1cZnJhY3tcYWxwaGEoeS1cdGF1KngpfXtyKHgpfSQuIFN1YnN0aXR1dGluZyB0aGVzZSBpbnRvIHRoZSBzcGF0aWFsIGVxdWlsaWJyaXVtIGNvbmRpdGlvbiAoZXF1YWwgdXRpbGl0eSkgZ2l2ZXM6DQoNCiQkVShsLHopPVxsZWZ0W1xmcmFje1xhbHBoYSh5LVx0YXUqeCl9e3IoeCl9XHJpZ2h0XV57XGFscGhhfVxsZWZ0WygxLVxhbHBoYSkoeS1cdGF1KngpXHJpZ2h0XV57MS1cYWxwaGF9PVxiYXJ7dX1cdGFnezN9JCQNCldlIGNhbiByZXdyaXRlIHRoaXMgZXF1YXRpb24gdG8gZXhwcmVzcyBsYW5kIHJlbnQgYXQgJHgkIGFzIGEgZnVuY3Rpb24gb2YgJHkkLCAkXHRhdSQsICRcYmFye3V9JCwgYW5kICRcYWxwaGEkLg0KJCRyKHgpPVxsZWZ0KFxmcmFje3ktXHRhdSp4fXtcYmFye3V9fVxyaWdodClee1xmcmFjezF9e1xhbHBoYX19XGFscGhhKDEtXGFscGhhKV57XGZyYWN7MS1cYWxwaGF9e1xhbHBoYX19XHRhZ3s0fSQkDQpUaGUgQWxvbnNvLU11dGggY29uZGl0aW9uIHRlbGxzIHVzIHRoZSBncmFkaWVudCBvZiB0aGUgbGFuZCByZW50LCB3aGljaCB3ZSBjb3VsZCBhbHNvIGRlcml2ZSBieSB0YWtpbmcgdGhlIGRlcml2YXRpdmUgb2YgdGhlIGFib3ZlIGVxdWF0aW9uOg0KJCRcZnJhY3tkcih4KX17ZHh9PS1cdGF1KCgxLVxhbHBoYSkoeS1cdGF1KngpKV57XGZyYWN7MS1cYWxwaGF9e1xhbHBoYX19XGJhcnt1fV57XGZyYWN7LTF9e1xhbHBoYX19PVxmcmFjey1cdGF1fXtsKHgpfVx0YWd7NX0kJA0KVGhlcmUgYXJlICQxL2woeCkkIHBlb3BsZSBsaXZpbmcgYXQgZXZlcnkgbG9jYXRpb24gJHgkLiBDb21iaW5pbmcgdGhlIEFsb25zby1NdXRoIGNvbmRpdGlvbiB3aXRoIHRoZSByZXF1aXJlbWVudCB0aGF0IGV2ZXJ5b25lIGlzIGhvdXNlZCBpbiB0aGUgY2l0eSBpbXBsaWVzIHRoYXQ6DQokJFxkaXNwbGF5c3R5bGVcaW50X3t4PTB9XntcYmFye3h9fVxmcmFjezF9e2woeCl9ZHg9XGZyYWN7MX17LVx0YXV9XGRpc3BsYXlzdHlsZVxpbnRfe3g9MH1ee1xiYXJ7eH19XGZyYWN7ZHIoeCl9e2R4fWR4PVxmcmFje3IoXGJhcnt4fSktcigwKX17LVx0YXV9PU5cdGFnezZ9JCQNClVzaW5nICRyKFxiYXJ7eH0pPXJfQSQgZ2l2ZXMgJHIoMCk9XHRhdSpOK3IoXGJhcnt4fSkkLiBXZSBjYW4gdGhlbiBmaW5kIHRoZSB1dGlsaXR5IG9mIGEgY29uc3VtZXIgYXQgdGhlIGNlbnRlciBieSBpbnNlcnRpbmcgdGhpcyBleHByZXNzaW9uIGZvciAkcigwKSQgaW50byB0aGUgaW5kaXJlY3QgdXRpbGl0eSBmdW5jdGlvbiAoZXEgMyksIHRodXMgZ2l2aW5nIHVzICRcYmFye3V9JC4gRmluYWxseSwgd2l0aCAkXGJhcnt1fSQgd2UgY2FuIHNvbHZlIGZvciAkXGJhcnt4fSQgYnkgdGhlIGxhbmQgcmVudCBlcXVhdGlvbiAoZXEgNCkgZXF1YWwgdG8gJHJfQSQuDQoNCiMjIFNvbHZpbmcgZm9yIGVxdWlsaWJyaXVtDQpGaXJzdCwgbGV0J3Mgc2V0IHRoZSBleG9nZW5vdXMgcGFyYW1ldGVyczogJFxhbHBoYSQsICR5JCwgJFx0YXUkLCAkcl9BJCwgYW5kICROJC4NCmBgYHtyfQ0KYWxwaGE8LTAuNQ0KeTwtMTAwDQp0YXU8LTENCnIuQTwtNTANCk48LTEwMDANCmBgYA0KTmV4dCwgbGV0J3Mgd3JpdGUgZnVuY3Rpb25zIGZvciB0aGUgaW5kaXJlY3QgdXRpbGl0eSBhbmQgbGFuZCByZW50LCBzbyB0aGF0IHdlIGNhbiBzb2x2ZSBmb3IgdGhlIGVxdWlsaWJyaXVtIHZhbHVlcyBvZiAkXGJhcnt1fSQgYW5kICRcYmFye3h9JC4NCmBgYHtyfQ0KVjwtZnVuY3Rpb24oeCxyLngsYWxwaGEseSx0YXUpew0KICBsLng8LWFscGhhKih5LXRhdSp4KS9yLnggI2RlbWFuZCBmb3IgbGFuZA0KICB6Lng8LSgxLWFscGhhKSooeS10YXUqeCkgI2RlbWFuZCBmb3IgbnVtZXJhaXJlDQogIGwueF5hbHBoYSp6LnheKDEtYWxwaGEpICNyZXR1cm5zIHRoZSB1dGlsaXR5IGF0IHgNCn0NClI8LWZ1bmN0aW9uKHgsYWxwaGEseSx0YXUsdS5iYXIpIHsNCiAgaW5uZXI8LSh5LXRhdSp4KS91LmJhcg0KICBjb25zdDwtYWxwaGEqKDEtYWxwaGEpXigoMS1hbHBoYSkvYWxwaGEpDQogIGlubmVyXigxL2FscGhhKSpjb25zdCAjcmV0dXJucyB0aGUgcmVudCBhdCB4DQp9DQpgYGANCk5vdyBsZXQncyBzb2x2ZSBmb3IgdGhlIGVxdWlsaWJyaXVtIHZhbHVlcy4gVG8gZmluZCB0aGUgZnJpbmdlIHdlIHdpbGwgbG9vayBmb3IgdGhlIHZhbHVlICRcYmFye3h9JCBzdWNoIHRoYXQgJFIoXGJhcnt4fSktcl9BPTAkLg0KYGBge3J9DQpyLjA8LXIuQSt0YXUqTg0KdS5iYXI8LVYoMCxyLjAsYWxwaGEseSx0YXUpDQojRGVmaW5lIGEgZnVuY3Rpb24gc28gdGhhdCB3ZSBjYW4gZmluZCB4LmJhcg0KZmluZC54YmFyPC1mdW5jdGlvbih4LGFscGhhLHksdGF1LHIuQSx1LmJhcikgew0KICBSKHgsYWxwaGEseSx0YXUsdS5iYXIpLXIuQQ0KfQ0KeC5iYXI8LWFzLm51bWVyaWModW5pcm9vdChmaW5kLnhiYXIsbG93ZXI9MCx1cHBlcj15L3RhdSxhbHBoYT1hbHBoYSx5PXksdGF1PXRhdSxyLkE9ci5BLHUuYmFyPXUuYmFyKVsxXSkNCmBgYA0KVGhlIGVxdWlsaWJyaXVtIHZhbHVlcyBhcmUgJFxiYXJ7dX0kPWByIHUuYmFyYCBhbmQgJFxiYXJ7eH0kPWByIHguYmFyYC4NCklzIHRoaXMgY29ycmVjdD8gTGV0J3MgY2hlY2sgaWYgaW50ZWdyYXRpbmcgdGhlIHBvcHVsYXRpb24gYXQgZWFjaCBsb2NhdGlvbiBpcyBlcXVhbCB0byB0aGUgdG90YWwsICROJC4NCmBgYHtyfQ0KbC5kZW1hbmQ8LWZ1bmN0aW9uKHgsYWxwaGEseSx0YXUsci54KSB7ICNkZW1hbmQgZm9yIGxhbmQNCiAgYWxwaGEqKHktdGF1KngpL3IueA0KfQ0KcG9wPC1mdW5jdGlvbih4LGFscGhhLHksdGF1LHUuYmFyKSB7DQogIHIueDwtUih4LGFscGhhLHksdGF1LHUuYmFyKQ0KICAxL2wuZGVtYW5kKHgsYWxwaGEseSx0YXUsci54KQ0KfQ0KTi5jaGVjazwtaW50ZWdyYXRlKHBvcCxsb3dlcj0wLHVwcGVyPXguYmFyLGFscGhhPWFscGhhLHk9eSx0YXU9dGF1LHUuYmFyPXUuYmFyKSAjdGhpcyBzaG91bGQgYmUgZXF1YWwgdG8gTg0KYGBgDQpJbnRlZ3JhdGluZyB0aGUgcG9wdWxhdGlvbiBvdmVyIHRoZSBjaXR5IHlpZWxkcyBhIHRvdGFsIHBvcHVsYXRpb24gb2YgKk4uY2hlY2sqPWByIE4uY2hlY2skdmFsdWVgDQoNCiMjIEdyYXBoaW5nDQpGaXJzdCwgbGV0J3MgZ3JhcGggdGhlIGVxdWlsaWJyaXVtIHJlbnQgY3VydmUNCmBgYHtyfQ0KY3VydmUoUih4LGFscGhhLHksdGF1LHUuYmFyKSxmcm9tPTAsdG89eC5iYXIseGxhYj0iRGlzdGFuY2UgZnJvbSBjZW50ZXIgKHgpIix5bGFiPSJMYW5kIHJlbnQsIHIoeCkiLG1haW49IkxhbmQgcmVudCBvdmVyIHRoZSBjaXR5IikNCmBgYA0KTmV4dCB3ZSBjYW4gbG9vayBhdCBsYW5kIGNvbnN1bXB0aW9uOg0KYGBge3J9DQpjdXJ2ZShsLmRlbWFuZCh4LGFscGhhLHksdGF1LFIoeCxhbHBoYSx5LHRhdSx1LmJhcikpLGZyb209MCx0bz14LmJhcix4bGFiPSJEaXN0YW5jZSBmcm9tIGNlbnRlciAoeCkiLHlsYWI9IkxhbmQgY29uc3VtcHRpb24sIGwoeCkiLG1haW49IkxhbmQgY29uc3VtcHRpb24gb3ZlciB0aGUgY2l0eSIpDQpgYGANCg0KIyMjIENvbXBhcmF0aXZlIFN0YXRpY3MNCk5vdyBsZXQncyBsb29rIGF0IHNvbWUgY29tcGFyYXRpdmUgc3RhdGljcy4NCmBgYHtyfQ0KeS4xPC01MDANCnRhdS4xPC0wLjcNCnIuQS4xPC0xMDANCk4uMTwtNTAwMA0KYGBgDQpIb3cgZG9lcyBhIGNoYW5nZSAgaW4gdGhlIHRyYW5zcG9yYXRpb24gY29zdCAkXHRhdSQgZnJvbSAkXHRhdV8wJD1gciB0YXVgIHRvICRcdGF1XzEkPWByIHRhdS4xYCBhZmZlY3QgbGFuZCBjb25zdW1wdGlvbiBhdCBldmVyeSBwb2ludD8NCmBgYHtyfQ0Kci4wLjE8LXIuQSt0YXUuMSpODQp1LmJhci4xPC1WKDAsci4wLjEsYWxwaGEseSx0YXUuMSkNCnguYmFyLjE8LWFzLm51bWVyaWModW5pcm9vdChmaW5kLnhiYXIsbG93ZXI9MCx1cHBlcj15L3RhdS4xLGFscGhhPWFscGhhLHk9eSx0YXU9dGF1LjEsci5BPXIuQSx1LmJhcj11LmJhci4xKVsxXSkNCg0KY3VydmUoUih4LGFscGhhLHksdGF1LjEsdS5iYXIuMSksZnJvbT0wLHRvPXguYmFyLjEseGxhYj0iRGlzdGFuY2UgZnJvbSBjZW50ZXIgKHgpIix5bGFiPSJMYW5kIHJlbnQsIHIoeCkiLG1haW49IkxhbmQgcmVudCBvdmVyIHRoZSBjaXR5Iixjb2w9InJlZCIseWxpbT1jKDAsbWF4KHIuMCxyLjAuMSkpLHhsaW09YygwLG1heCh4LmJhcix4LmJhci4xKSkpDQpjdXJ2ZShSKHgsYWxwaGEseSx0YXUsdS5iYXIpLGZyb209MCx0bz14LmJhcixhZGQ9VFJVRSxjb2w9ImJsYWNrIikNCnRleHQoeC5iYXIsbC5kZW1hbmQoeC5iYXIsYWxwaGEseSx0YXUsci5BKSwidGF1LjAiKQ0KdGV4dCh4LmJhci4xLGwuZGVtYW5kKHguYmFyLjEsYWxwaGEseSx0YXUuMSxyLkEpLCJ0YXUuMSIsY29sPSJyZWQiKQ0KDQpjdXJ2ZShsLmRlbWFuZCh4LGFscGhhLHksdGF1LjEsUih4LGFscGhhLHksdGF1LjEsdS5iYXIuMSkpLGZyb209MCx0bz14LmJhci4xLHhsYWI9IkRpc3RhbmNlIGZyb20gY2VudGVyICh4KSIseWxhYj0iTGFuZCBjb25zdW1wdGlvbiwgbCh4KSIsbWFpbj0iTGFuZCBjb25zdW1wdGlvbiBvdmVyIHRoZSBjaXR5Iixjb2w9InJlZCIseWxpbT1jKDAsMC4zKSx4bGltPWMoMCxtYXgoeC5iYXIseC5iYXIuMSkpKQ0KY3VydmUobC5kZW1hbmQoeCxhbHBoYSx5LHRhdSxSKHgsYWxwaGEseSx0YXUsdS5iYXIpKSxmcm9tPTAsdG89eC5iYXIsYWRkPVRSVUUsY29sPSJibGFjayIpDQp0ZXh0KHguYmFyLGwuZGVtYW5kKHguYmFyLGFscGhhLHksdGF1LHIuQSksInRhdS4wIikNCnRleHQoeC5iYXIuMSxsLmRlbWFuZCh4LmJhci4xLGFscGhhLHksdGF1LjEsci5BKSwidGF1LjEiLGNvbD0icmVkIikNCmBgYA0KDQoNCiMgUiBOb3RlYm9vayBJbnN0cnVjdGlvbnMNCkFkZCBhIG5ldyBjaHVuayBieSBjbGlja2luZyB0aGUgKkluc2VydCBDaHVuayogYnV0dG9uIG9uIHRoZSB0b29sYmFyIG9yIGJ5IHByZXNzaW5nICpDdHJsK0FsdCtJKi4NCg0KV2hlbiB5b3Ugc2F2ZSB0aGUgbm90ZWJvb2ssIGFuIEhUTUwgZmlsZSBjb250YWluaW5nIHRoZSBjb2RlIGFuZCBvdXRwdXQgd2lsbCBiZSBzYXZlZCBhbG9uZ3NpZGUgaXQgKGNsaWNrIHRoZSAqUHJldmlldyogYnV0dG9uIG9yIHByZXNzICpDdHJsK1NoaWZ0K0sqIHRvIHByZXZpZXcgdGhlIEhUTUwgZmlsZSkuDQoNClRoZSBwcmV2aWV3IHNob3dzIHlvdSBhIHJlbmRlcmVkIEhUTUwgY29weSBvZiB0aGUgY29udGVudHMgb2YgdGhlIGVkaXRvci4gQ29uc2VxdWVudGx5LCB1bmxpa2UgKktuaXQqLCAqUHJldmlldyogZG9lcyBub3QgcnVuIGFueSBSIGNvZGUgY2h1bmtzLiBJbnN0ZWFkLCB0aGUgb3V0cHV0IG9mIHRoZSBjaHVuayB3aGVuIGl0IHdhcyBsYXN0IHJ1biBpbiB0aGUgZWRpdG9yIGlzIGRpc3BsYXllZC4NCg==