BT /F41 8.9664 Tf 54 712.0299 Td[(6.5)-1000(Calling)-250(Exter)15(nal)-250(Functions)]TJ/F42 8.9664 Tf 0 -13.9477 Td[(Lik)10(e)-254(most)-254(interpreters,)-254(SpiderMonk)10(e)15(y)-254(has)-254(a)-254(foreign)-254(function)-254(inter)20(-)]TJ 0 -9.9626 Td[(f)10(ace)-231(\050FFI\051)-232(that)-231(allo)25(ws)-232(it)-231(to)-232(call)-231(C)-232(b)20(uiltins)-231(and)-232(host)-231(system)-232(functions)]TJ 0 -9.9627 Td[(\050e.g.,)-301(web)-301(bro)25(wser)-301(control)-301(and)-300(DOM)-301(access\051.)-301(The)-301(FFI)-301(has)-301(a)-301(stan-)]TJ 0 -9.9626 Td[(dard)-225(signat)1(ure)-225(for)-225(JS-callable)-224(functions,)-225(the)-224(k)10(e)15(y)-225(ar)18(gument)-224(of)-225(which)]TJ 0 -9.9627 Td[(is)-313(an)-313(array)-313(of)-313(box)15(ed)-312(v)25(alues.)-313(External)-313(functions)-313(called)-313(through)-313(the)]TJ 0 -9.9626 Td[(FFI)-214(interact)-215(with)-214(the)-214(program)-215(state)-214(through)-215(an)-214(interpreter)-214(API)-215(\050e.g.,)]TJ 0 -9.9626 Td[(to)-280(read)-279(a)-280(property)-279(from)-280(an)-279(ar)18(gument\051.)-280(There)-279(are)-280(also)-279(certain)-280(inter)20(-)]TJ 0 -9.9627 Td[(preter)-223(b)20(uiltins)-224(that)-223(do)-224(not)-223(use)-223(the)-224(FFI,)-223(b)20(ut)-224(interact)-223(with)-223(the)-224(program)]TJ 0 -9.9626 Td[(state)-369(i)1(n)-369(the)-369(same)-368(w)10(ay)65(,)-369(such)-368(as)-369(the)]TJ/F33 8.9664 Tf 130.5975 0 Td[(CallIteratorNext)]TJ/F42 8.9664 Tf 78.6212 0 Td[(function)]TJ -209.2187 -9.9627 Td[(used)-325(with)-325(it)1(erator)-325(objects.)-325(T)35(raceMonk)10(e)15(y)-325(must)-324(support)-325(this)-325(FFI)-325(in)]TJ 0 -9.9626 Td[(order)-218(to)-218(speed)-217(up)-218(code)-218(that)-218(interacts)-218(with)-217(the)-218(host)-218(system)-218(inside)-218(hot)]TJ 0 -9.9626 Td[(loops.)]TJ 11.9552 -9.9627 Td[(Calling)-225(e)15(xternal)-226(functions)-225(from)-226(T)35(raceMonk)10(e)15(y)-225(is)-226(potentially)-225(dif-)]TJ -11.9552 -9.9626 Td[(\002cult)-330(because)-330(trac)1(es)-330(do)-330(not)-330(update)-330(the)-329(interpreter)-330(state)-330(until)-330(e)15(xit-)]TJ 0 -9.9627 Td[(ing.)-268(In)-268(particular)40(,)-268(e)15(xternal)-269(functions)-268(may)-268(need)-268(the)-268(call)-268(stack)-269(or)-268(the)]TJ 0 -9.9626 Td[(global)-250(v)25(ariables,)-250(b)20(ut)-250(the)15(y)-250(may)-250(be)-250(out)-250(of)-250(date.)]TJ 11.9552 -9.9626 Td[(F)15(or)-340(the)-340(out-of-date)-340(call)-340(stack)-340(problem,)-340(we)-340(re)1(f)10(actored)-340(some)-340(of)]TJ -11.9552 -9.9627 Td[(the)-302(interpreter)-303(API)-302(implementation)-302(functions)-302(to)-302(re-materialize)-303(the)]TJ 0 -9.9626 Td[(interpreter)-250(call)-250(stack)-250(on)-250(demand.)]TJ 11.9552 -9.9627 Td[(W)80(e)-311(de)26(v)14(e)1(loped)-311(a)-310(C++)-311(static)-310(analysis)-311(and)-310(annotated)-311(some)-310(inter)20(-)]TJ -11.9552 -9.9626 Td[(preter)-361(funct)1(ions)-361(in)-361(order)-360(to)-361(v)15(erify)-360(that)-361(the)-360(call)-361(stack)-360(is)-361(refreshed)]TJ 0 -9.9626 Td[(at)-327(an)15(y)-327(point)-327(it)-326(needs)-327(to)-327(be)-327(used.)-327(In)-327(order)-326(to)-327(access)-327(the)-327(call)-327(stack,)]TJ 0 -9.9627 Td[(a)-470(function)-469(must)-470(be)-469(annotated)-470(as)-469(either)-495(F)]TJ/F42 7.1731 Tf 157.6439 0 Td[(O)-62(R)-61(C)-62(E)-62(S)]TJ/F42 8.9664 Tf 25.3297 0 Td[(S)]TJ/F42 7.1731 Tf 5.4335 0 Td[(T)31(A)-22(C)-61(K)]TJ/F42 8.9664 Tf 24.3304 0 Td[(or)-495(R)]TJ/F42 7.1731 Tf 18.3321 0 Td[(E)]TJ/F42 8.9664 Tf 4.8238 0 Td[(-)]TJ/F42 7.1731 Tf -235.6693 -9.9626 Td[(Q)-52(U)-61(I)-62(R)-62(E)-62(S)]TJ/F42 8.9664 Tf 28.4857 0 Td[(S)]TJ/F42 7.1731 Tf 5.4336 0 Td[(T)31(A)-22(C)-61(K)]TJ/F42 8.9664 Tf 20.1202 0 Td[(.)-232(These)-233(annotations)-232(are)-233(also)-232(required)-233(i)1(n)-233(order)-232(to)-233(call)]TJ -54.0395 -9.9627 Td[(R)]TJ/F42 7.1731 Tf 6.4288 0 Td[(E)-61(Q)-52(U)-62(I)-62(R)-62(E)-61(S)]TJ/F42 8.9664 Tf 33.3095 0 Td[(S)]TJ/F42 7.1731 Tf 5.4336 0 Td[(T)31(A)-22(C)-61(K)]TJ/F42 8.9664 Tf 22.1792 0 Td[(functions,)-230(which)-229(are)-230(presumed)-229(to)-230(access)-230(the)-229(call)]TJ -67.5752 -9.9626 Td[(stack)-345(transi)1(ti)25(v)15(ely)65(.)-370(F)]TJ/F42 7.1731 Tf 71.9106 0 Td[(O)-62(R)-61(C)-62(E)-62(S)]TJ/F42 8.9664 Tf 25.3297 0 Td[(S)]TJ/F42 7.1731 Tf 5.4336 0 Td[(T)31(A)-22(C)-61(K)]TJ/F42 8.9664 Tf 23.2098 0 Td[(is)-345(a)-344(trusted)-345(annotation,)-344(applied)]TJ -125.8837 -9.9626 Td[(to)-223(only)-222(5)-223(functions,)-222(that)-223(means)-223(the)-222(function)-223(refreshes)-222(the)-223(call)-223(stack.)]TJ 0.2241 -9.9627 Td[(R)]TJ/F42 7.1731 Tf 6.4288 0 Td[(E)-61(Q)-52(U)-62(I)-62(R)-62(E)-61(S)]TJ/F42 8.9664 Tf 33.3096 0 Td[(S)]TJ/F42 7.1731 Tf 5.4335 0 Td[(T)31(A)-22(C)-61(K)]TJ/F42 8.9664 Tf 22.8303 0 Td[(is)-302(an)-302(untrusted)-303(annotation)-302(that)-302(means)-302(the)-303(func-)]TJ -68.2263 -9.9626 Td[(tion)-234(may)-235(only)-234(be)-235(called)-234(if)-234(the)-235(call)-234(stack)-235(has)-234(already)-234(been)-235(refreshed.)]TJ 11.9551 -9.9627 Td[(Similarly)65(,)-435(we)-436(detect)-435(when)-436(host)-435(functions)-436(attem)1(pt)-436(to)-435(directly)]TJ -11.9551 -9.9626 Td[(read)-234(or)-234(write)-234(global)-233(v)25(ariables,)-234(and)-234(force)-234(the)-234(currently)-234(running)-234(trace)]TJ 0 -9.9626 Td[(to)-388(side)-388(e)15(xit.)-388(This)-389(is)-388(necessary)-388(since)-388(we)-388(cache)-388(and)-389(unbox)-388(global)]TJ 0 -9.9627 Td[(v)25(ariables)-250(into)-250(the)-250(acti)25(v)25(ation)-250(record)-250(during)-250(trace)-250(e)15(x)15(ecution.)]TJ 11.9551 -9.9626 Td[(Since)-504(both)-504(call-stack)-504(access)-504(and)-504(global)-504(v)25(ariable)-504(access)-504(are)]TJ -11.9551 -9.9627 Td[(rarely)-198(performed)-199(by)-198(host)-199(functions,)-198(performance)-199(is)-198(not)-199(signi\002cantly)]TJ 0 -9.9626 Td[(af)25(fected)-250(by)-250(these)-250(safety)-250(mechanisms.)]TJ 11.9551 -9.9626 Td[(Another)-233(problem)-233(is)-233(that)-233(e)15(xternal)-233(functions)-233(can)-233(ree)1(nter)-233(the)-233(inter)20(-)]TJ -11.9551 -9.9627 Td[(preter)-287(by)-287(calling)-287(scripts,)-287(which)-287(in)-287(turn)-287(ag)5(ain)-288(m)1(ight)-288(w)10(ant)-287(to)-287(access)]TJ 0 -9.9626 Td[(the)-217(call)-217(stack)-217(or)-217(global)-217(v)25(ariables.)-217(T)80(o)-217(address)-217(this)-218(problem,)-217(we)-217(made)]TJ 0 -9.9627 Td[(the)-203(VM)-203(set)-203(a)-203(\003ag)-203(whene)25(v)15(er)-203(the)-203(interpreter)-203(is)-204(r)1(eentered)-204(while)-203(a)-203(com-)]TJ 0 -9.9626 Td[(piled)-250(trace)-250(is)-250(running.)]TJ 11.9551 -9.9626 Td[(Ev)15(ery)-232(call)-232(to)-231(an)-232(e)15(xternal)-232(function)-232(then)-231(checks)-232(this)-232(\003ag)-232(and)-231(e)15(xits)]TJ -11.9551 -9.9627 Td[(the)-206(trace)-206(immediately)-206(after)-206(returning)-206(from)-206(the)-207(e)15(xternal)-206(function)-206(call)]TJ 0 -9.9626 Td[(if)-282(it)-281(is)-282(set.)-282(There)-282(are)-281(man)15(y)-282(e)15(xternal)-282(functions)-282(t)1(hat)-282(seldom)-282(or)-282(ne)25(v)15(er)]TJ 0 -9.9627 Td[(reenter)40(,)-395(and)-395(the)15(y)-395(can)-395(be)-395(called)-395(without)-395(problem,)-395(and)-395(will)-395(cause)]TJ 0 -9.9626 Td[(trace)-250(e)15(xit)-250(only)-250(if)-250(necessary)65(.)]TJ 11.9551 -9.9626 Td[(The)-423(FFI')55(s)-422(box)15(ed)-423(v)25(alue)-422(array)-423(requirement)-422(has)-423(a)-422(performance)]TJ -11.9551 -9.9627 Td[(cost,)-369(so)-370(we)-369(de\002ned)-370(a)-369(ne)25(w)-370(FFI)-369(that)-370(allo)25(w)1(s)-370(C)-369(functions)-370(to)-369(be)-370(an-)]TJ 0 -9.9626 Td[(notated)-320(with)-320(their)-321(ar)18(gument)-320(types)-320(so)-320(that)-321(the)-320(tracer)-320(can)-320(call)-321(them)]TJ 0 -9.9627 Td[(directly)65(,)-250(without)-250(unnecessary)-250(ar)18(gument)-250(con)40(v)15(ersions.)]TJ 11.9551 -9.9626 Td[(Currently)65(,)-258(we)-258(do)-258(not)-258(support)-258(calling)-258(nati)25(v)15(e)-258(property)-258(get)-258(and)-258(set)]TJ -11.9551 -9.9626 Td[(o)15(v)15(erride)-299(functions)-300(or)-299(DOM)-300(functions)-299(directly)-300(from)-299(trace.)-300(Support)]TJ 0 -9.9627 Td[(is)-250(planned)-250(future)-250(w)10(ork.)]TJ/F41 8.9664 Tf 0 -17.9327 Td[(6.6)-1000(Corr)18(ectness)]TJ/F42 8.9664 Tf 0 -13.9477 Td[(During)-482(de)25(v)15(elopment,)-481(we)-482(had)-482(access)-482(to)-481(e)15(xisting)-482(Ja)20(v)25(aScript)-482(test)]TJ 0 -9.9627 Td[(suites,)-363(b)20(ut)-363(most)-363(of)-363(them)-363(were)-363(not)-363(designed)-363(with)-364(tracing)-363(VMs)-363(in)]TJ 0 -9.9626 Td[(mind)-250(and)-250(contained)-250(fe)25(w)-250(loops.)]TJ 11.9551 -9.9626 Td[(One)-346(tool)-346(that)-346(helped)-346(us)-346(greatly)-346(w)10(as)-346(Mozilla')55(s)-346(Ja)20(v)25(aScript)-346(fuzz)]TJ -11.9551 -9.9627 Td[(tester)40(,)]TJ/F42 7.1731 Tf 24.6182 0 Td[(J)-62(S)-62(F)-61(U)-62(N)-62(F)-61(U)-62(Z)-61(Z)]TJ/F42 8.9664 Tf 42.8138 0 Td[(,)-345(which)-344(generates)-345(random)-345(Ja)20(v)25(aScript)-344(programs)]TJ -67.432 -9.9626 Td[(by)-378(nesting)-377(random)-378(language)-378(elements.)-377(W)80(e)-378(modi\002ed)]TJ/F42 7.1731 Tf 196.2896 0 Td[(J)-62(S)-62(F)-61(U)-62(N)-62(F)-61(U)-62(Z)-61(Z)]TJ/F42 8.9664 Tf -196.2896 -9.9627 Td[(to)-311(generate)-311(loops,)-310(and)-311(also)-311(to)-311(test)-310(more)-311(hea)20(vily)-311(certain)-311(constructs)]TJ 0 -9.9626 Td[(we)-236(suspected)-237(w)10(ould)-236(re)25(v)15(eal)-236(\003a)15(ws)-236(in)-237(our)-236(implementation.)-236(F)15(or)-237(e)15(xam-)]TJ 0 -9.9626 Td[(ple,)-195(we)-194(suspected)-195(b)20(ugs)-194(in)-195(T)35(raceMonk)10(e)15(y')55(s)-195(handling)-194(of)-195(type-unstable)]TJ ET 1 0 0 1 317.0137 506.1815 cm q .55 0 0 .55 0 0 cm q 1 0 0 1 -55.1171 -332.1152 cm /Im7 Do Q Q 1 0 0 1 0 -11.2876 cm q []0 d 0 J 0.3288 w 0 0.1644 m 239.1034 0.1644 l S Q 1 0 0 1 -317.0137 -494.8939 cm BT /F41 8.9664 Tf 317.0137 484.731 Td[(Figur)18(e)-377(11.)-500(Fraction)-378(of)-377(dynamic)-378(bytecodes)-377(executed)-377(by)-378(inter)37(-)]TJ 0 -9.9626 Td[(pr)18(eter)-257(and)-257(on)-256(nati)10(v)10(e)-257(traces.)]TJ/F42 8.9664 Tf 107.5414 0 Td[(The)-257(speedup)-257(vs.)-256(interpreter)-257(is)-257(sho)25(wn)]TJ -107.5414 -9.9627 Td[(in)-408(parentheses)-408(ne)15(xt)-408(to)-408(each)-408(test.)-408(The)-408(fraction)-408(of)-408(bytecodes)-408(e)15(x)15(e-)]TJ 0 -9.9626 Td[(cuted)-444(whil)1(e)-444(recording)-444(is)-443(too)-444(small)-443(to)-444(see)-443(in)-444(this)-443(\002gure,)-444(e)15(xcept)]TJ 0 -9.9626 Td[(for)]TJ/F33 8.9664 Tf 12.9821 0 Td[(crypto-md5)]TJ/F42 8.9664 Tf 47.073 0 Td[(,)-282(where)-282(fully)-282(3%)-281(of)-282(bytecodes)-282(are)-282(e)15(x)15(ecuted)-282(while)]TJ -60.0551 -9.9627 Td[(recording.)-357(In)-356(most)-357(of)-357(the)-357(test)1(s,)-357(almost)-357(all)-357(the)-356(bytecodes)-357(are)-357(e)15(x)15(e-)]TJ 0 -9.9626 Td[(cuted)-304(by)-303(compiled)-304(traces.)-303(Three)-304(of)-303(the)-304(benchmarks)-304(are)-303(not)-304(traced)]TJ 0 -9.9627 Td[(at)-250(all)-250(and)-250(run)-250(in)-250(the)-250(interpreter)55(.)]TJ 0 -29.4951 Td[(loops)-267(and)-266(hea)20(vily)-267(branching)-266(code,)-267(and)-266(a)-267(specialized)-267(fuzz)-266(tester)-267(in-)]TJ 0 -9.9627 Td[(deed)-193(re)25(v)15(ealed)-194(se)25(v)15(eral)-193(re)15(gressions)-194(which)-193(we)-193(subsequently)-194(corrected.)]TJ/F41 10.9589 Tf 0 -24.1524 Td[(7.)-1000(Ev)10(aluation)]TJ/F42 8.9664 Tf 0 -13.9477 Td[(W)80(e)-430(e)25(v)25(aluated)-430(our)-431(Ja)20(v)25(aScript)-430(tracing)-430(implementation)-430(using)-431(Sun-)]TJ 0 -9.9626 Td[(Spider)40(,)-290(the)-291(indus)1(try)-291(standard)-290(Ja)20(v)25(aScript)-290(benchmark)-290(suite.)-291(SunSpi-)]TJ 0 -9.9627 Td[(der)-322(consists)-322(of)-323(26)-322(short-running)-322(\050less)-322(than)-322(250ms,)-323(a)20(v)15(era)1(ge)-323(26ms\051)]TJ 0 -9.9626 Td[(Ja)20(v)25(aScript)-298(programs.)-299(This)-299(is)-298(in)-299(stark)-298(contrast)-299(to)-298(benchmark)-299(suites)]TJ 0 -9.9627 Td[(such)-328(as)-329(SpecJVM98)-328(\0503\051)-328(used)-328(to)-329(e)25(v)25(aluate)-328(desktop)-328(and)-328(serv)15(er)-329(Ja)20(v)25(a)]TJ 0 -9.9626 Td[(VMs.)-268(Man)15(y)-267(programs)-268(in)-268(those)-267(benchmarks)-268(use)-268(lar)18(ge)-267(data)-268(sets)-268(and)]TJ 0 -9.9626 Td[(e)15(x)15(ecute)-220(for)-220(minutes.)-220(The)-220(SunSpider)-220(programs)-220(carry)-220(out)-220(a)-220(v)25(ariety)-220(of)]TJ 0 -9.9627 Td[(tasks,)-232(primarily)-232(3d)-232(rendering,)-232(bit-bashing,)-233(cryptographic)-232(encoding,)]TJ 0 -9.9626 Td[(math)-250(k)10(ernels,)-250(and)-250(string)-250(processing.)]TJ 11.9552 -9.9627 Td[(All)-363(e)15(xperiments)-363(were)-364(performed)-363(on)-363(a)-364(MacBook)-363(Pro)-363(with)-363(2.2)]TJ -11.9552 -9.9626 Td[(GHz)-250(Core)-250(2)-250(processor)-250(and)-250(2)-250(GB)-250(RAM)-250(running)-250(MacOS)-250(10.5.)]TJ/F41 8.9664 Tf 11.9552 -9.9626 Td[(Benchmark)-380(r)18(esults.)]TJ/F42 8.9664 Tf 79.1263 0 Td[(The)-380(main)-380(question)-380(is)-380(whether)-380(programs)]TJ -91.0815 -9.9627 Td[(run)-240(f)10(aster)-240(with)-240(tracing.)-240(F)15(or)-240(this,)-240(we)-240(ran)-240(the)-240(standard)-240(SunSpider)-240(test)]TJ 0 -9.9626 Td[(dri)25(v)15(er)40(,)-389(which)-390(starts)-389(a)-390(Ja)20(v)25(aScript)-389(interpreter)40(,)-389(loads)-390(and)-389(runs)-390(each)]TJ 0 -9.9627 Td[(program)-349(once)-349(for)-349(w)10(armup,)-348(then)-349(loads)-349(and)-349(runs)-349(each)-349(program)-349(10)]TJ 0 -9.9626 Td[(times)-281(and)-281(reports)-281(the)-281(a)20(v)15(erage)-281(time)-281(tak)10(en)-281(by)-281(each.)-281(W)80(e)-282(ran)-281(4)-281(dif)25(fer)20(-)]TJ 0 -9.9626 Td[(ent)-271(con\002gurations)-272(for)-271(comparison:)-272(\050a\051)-271(SpiderMonk)10(e)15(y)65(,)-271(the)-272(baseline)]TJ 0 -9.9627 Td[(interpreter)40(,)-274(\050b\051)-275(T)35(raceMonk)10(e)15(y)65(,)-274(\050d\051)-275(SquirrelFish)-274(Extreme)-274(\050SFX\051,)-275(the)]TJ 0 -9.9626 Td[(call-threaded)-380(Ja)20(v)25(aScript)-380(interpreter)-379(used)-380(in)-380(Apple')55(s)-380(W)80(ebKit,)-380(and)]TJ 0 -9.9627 Td[(\050e\051)-250(V8,)-250(the)-250(method-compiling)-250(Ja)20(v)25(aScript)-250(VM)-250(from)-250(Google.)]TJ 11.9552 -9.9626 Td[(Figure)-197(10)-198(sho)25(ws)-197(the)-197(relati)25(v)15(e)-197(speedups)-198(achie)25(v)15(ed)-197(by)-197(tracing,)-197(SFX,)]TJ -11.9552 -9.9626 Td[(and)-267(V8)-268(ag)5(ainst)-267(the)-267(baseline)-268(\050SpiderMonk)10(e)15(y\051.)-267(T)35(racing)-267(achie)25(v)15(es)-268(the)]TJ 0 -9.9627 Td[(best)-257(speedups)-256(in)-257(inte)15(ger)20(-hea)20(vy)-257(be)1(nchmarks,)-257(up)-257(to)-256(the)-257(25x)-257(speedup)]TJ 0 -9.9626 Td[(on)]TJ/F33 8.9664 Tf 11.208 0 Td[(bitops-bitwise-and)]TJ/F42 8.9664 Tf 84.7313 0 Td[(.)]TJ -83.9841 -9.9627 Td[(T)35(raceMonk)10(e)15(y)-435(is)-435(the)-436(f)10(astest)-435(VM)-435(on)-435(9)-436(of)-435(the)-435(26)-435(benchmarks)]TJ -11.9552 -9.9626 Td[(\050)]TJ/F33 8.9664 Tf 2.9858 0 Td[(3d-morph)]TJ/F42 8.9664 Tf 37.6583 0 Td[(,)]TJ/F33 8.9664 Tf 7.4374 0 Td[(bitops-3bit-bits-in-byte)]TJ/F42 8.9664 Tf 112.9751 0 Td[(,)]TJ/F33 8.9664 Tf 7.4374 0 Td[(bitops-bitwise-)]TJ -168.494 -9.9626 Td[(and)]TJ/F42 8.9664 Tf 14.1219 0 Td[(,)]TJ/F33 8.9664 Tf 4.4651 0 Td[(crypto-sha1)]TJ/F42 8.9664 Tf 51.7802 0 Td[(,)]TJ/F33 8.9664 Tf 4.4652 0 Td[(math-cordic)]TJ/F42 8.9664 Tf 51.7802 0 Td[(,)]TJ/F33 8.9664 Tf 4.4652 0 Td[(math-partial-sums)]TJ/F42 8.9664 Tf 80.0239 0 Td[(,)]TJ/F33 8.9664 Tf 4.4652 0 Td[(math-)]TJ -215.5669 -9.9627 Td[(spectral-norm)]TJ/F42 8.9664 Tf 61.1948 0 Td[(,)]TJ/F33 8.9664 Tf 6.3166 0 Td[(string-base64)]TJ/F42 8.9664 Tf 61.1948 0 Td[(,)]TJ/F33 8.9664 Tf 6.3166 0 Td[(string-validate-input)]TJ/F42 8.9664 Tf 98.8532 0 Td[(\051.)]TJ ET